pandas列出列之间的所有公共值

2024-04-25 04:20:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,其中每列都包含ID号;如下所示:

LC3B.low    LC3B.hi  P62.low    P62.hi
PT 65       PT 172   PT 86      PT 135
PT 86       PT 65    PT 38      PT 56
PT 251      PT 251   PT 217     PT 261

我想列出在两列或更多列中看到的id。因此,对于所提供的值,熊猫会指出:

  • LC3B.low和LC3B.hi共享“PT 65”和“PT 251”
  • LC3B.low和P62.low份额“PT 86”

我不熟悉熊猫,也习惯了Perl。在Perl中,我会通过创建每个列的数组和散列来解决这个问题,然后使用print语句将每个数组的每个元素与每个散列进行比较和匹配,这样我的输出如下所示:

^{pr2}$

但这产生了一个混乱的输出,只是觉得这不是解决问题的最有效方法。熊猫肯定有一种天生的做这种事情的方式吗?在

更新:我一直在尝试学习使用SQL命令来完成这个任务,但是pandasql无法识别我的列名。所以基本上:

print pysqldf("SELECT * FROM df;")

打印表格但是

print pysqldf("SELECT ATG12.low FROM df;")

打印“无”

我绝对不会致力于在Pandas中使用SQL来解决这个问题。我们将非常感谢您对如何列出显示在多个列中的所有ID值的任何建议或建议


Tags: fromptiddfsql数组hiselect
2条回答

这里有一个解决方案,希望对大型数据集运行得更快一些,因为它没有实现for循环:

import pandas as pd
dfData = pd.DataFrame({'LC3B.low':['PT 65','PT 86','PT 251'],'LC3B.hi':['PT 172','PT 65','PT 251'], 'P62.low':['PT 86','PT 38','PT 217'], 'P62.hi':['PT 135','PT 56','PT 261']})          

x =  dfData.stack().reset_index()
x.columns = ['A','Col','Val']
y = x.drop(['A'],axis = 1)

valCount = y.groupby(['Val']).count()
valCount.columns = ['ColumnCount']

mergedData = pd.merge(y,valCount, left_on ='Val', right_index=True) 

output_data = mergedData[mergedData['ColumnCount'] >1].drop(['ColumnCount'],axis = 1)

print output_data

    Col     Val
1  LC3B.low   PT 65
4   LC3B.hi   PT 65
3   P62.low   PT 86
5  LC3B.low   PT 86
8   LC3B.hi  PT 251
9  LC3B.low  PT 251

这相当难看,但它输出的数据帧将提供您可能要查找的所有内容。在

results_df中的每一行给出了行索引在原始数据帧的给定列中出现的频率。在

import pandas as pd
df = pd.DataFrame({'A': [1,2,3],
                   'B': [3,4,5],
                   'C': [1,4,8],
                   'D': [3,7,2]})
unique_vals = pd.Series(df.values.ravel()).unique()
data_dict = {}
for i in unique_vals:
    row = []
    for v in df.columns:
        row.append( (df[v]==i).sum())
    data_dict[i] = row

results_df = pd.DataFrame(data_dict).T
results_df.columns = df.columns

results_df

   A  B  C  D
1  1  0  1  0
2  1  0  0  1
3  1  1  0  1
4  0  1  1  0
5  0  1  0  0
7  0  0  0  1
8  0  0  1  0

(感谢this answerunique_vals行提供了服务。)

相关问题 更多 >