我有一个 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)
输出-
在实践中,我的数据框明显更大,因此如果有更有效的方法来做到这一点,那么我们也非常感激。
您正在比较字符串,所以我猜使用
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