在数据帧的多列中查找不同的值对

问题描述 投票:0回答:1

我有一个 csv 文件,我将其读入 Python 中的数据框。我进行了各种转换,将数据转换为一种格式,其中每个行项目都有一定数量的列,这些列的属性由代码表示。并非所有行都具有相同数量的属性,因此某些列是 None 类型 - 对于给定的数据集,列数是任意的,因此首选涉及整个数据框的通用解决方案。

我尝试计算我可以执行的代码对(尽管可能不是一个优雅或有效的解决方案)。 我遇到的问题是无法获得唯一的配对 - 例如请参阅下面输出的第一行和最后一行。

我曾考虑过通过在查找对之前对每一行进行排序(不知道如何做到这一点)或以某种方式操纵输出来解决这个问题,我必须合并包含相同对的行。

最后,我想要第二个输出,其中仅包含两列以不同字母开头的行。

如有任何帮助,我们将不胜感激。

示例数据框 -

df2 = pd.DataFrame({'0':['F048','B123','F048','F420'],'1':['B65D', 'B65D',None, None],'2':['G07C', 'F048', 'B65D', None]})

**我尝试的是以下 - **

# Count combination pairs
c = Counter([y for x in df2.values for y in combinations(x, 2)])
df = pd.DataFrame({'Pair': list(c.keys()), 'Qty': list(c.values())})
# Remove None
df = df[~df['Pair'].astype('string').str.contains("None", na=False)]
# Sort by quantity
df = df.sort_values(by = 'Qty', ascending = False)

输出-

在实践中,我的数据框明显更大,因此如果有更有效的方法来做到这一点,那么我们也非常感激。

python pandas count unique transformation
1个回答
0
投票

您正在比较字符串,所以我猜使用

pandas
没有更多的改进空间。

您可以尝试将

"None"
字符串替换为 pd.nan 并在计算之前将其删除:

from collections import Counter
from itertools import combinations

c = Counter()
x = df.replace("None", np.nan).stack().dropna()
x.groupby(level=0).apply(lambda x: c.update(combinations(x, 2)))

out = pd.DataFrame(c.items(), columns=["Pair", "Qty"])
print(out)

打印:

           Pair  Qty
0  (F048, B65D)    2
1  (F048, G07C)    1
2  (B65D, G07C)    1
3  (B123, B65D)    1
4  (B123, F048)    1
5  (B65D, F048)    1
© www.soinside.com 2019 - 2024. All rights reserved.