【问题标题】:pandas list all values common between columns熊猫列出列之间的所有共同值
【发布时间】:2014-07-14 15:27:51
【问题描述】:

我有一个数据框,其中每一列都包含 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。因此,对于提供的值,pandas 将表明:

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

我是 Pandas 的新手,并且习惯于 Perl。在 Perl 中,我会通过创建数组和每列的哈希值来解决这个问题,然后根据每个哈希值检查每个数组的每个元素,并使用伴随每次比较和每个匹配项的打印语句,所以我的输出看起来像这样:

LC3B.low vs LC3B.hi
PT 65
PT 251
LC3B.low vs P62.low
PT 86
LC3B.low vs P62.hi
LC3B.hi vs P62.low
LC3B.hi vs P62.hi
P62.low vs P62.hi

但这会产生混乱的输出,并且感觉它不是解决问题的最有效方法。 Pandas 肯定有一种内置的方式来做这种事情吗?

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

print pysqldf("SELECT * FROM df;")

打印表格但是,

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

打印“无”

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

【问题讨论】:

  • 您是否需要知道他们共享的列,或者只是他们出现在 2 个或更多列中?
  • 我需要知道他们共享的列
  • 我认为点.在SQL中有特殊的含义——它分隔了数据库名、表名和列名。
  • 我尝试将列重命名为只有字母,但仍然遇到相同的 SQL 问题。

标签: python sql perl pandas dataframe


【解决方案1】:

这相当难看,但它会输出一个数据框,可以为您提供您可能正在寻找的一切。

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 answer 提供unique_vals 行。)

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2016-04-03
      • 1970-01-01
      • 2018-10-14
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      相关资源
      最近更新 更多