Python& Pandas:列之间的值查找和提取

时间:2017-10-15 15:29:44

标签: python pandas dataframe lookup extraction

编辑:我正在寻找关于如何处理此问题的提示

我试图在Pandas DF中执行相当高级的值查找,但我不知道如何处理它。

逻辑应如下:

  1. 查找id2中是否存在id1的匹配值。
  2. 如果匹配,列出与id1匹配的所有内容值,并列出每个单独的值,指定与id2匹配的所有值
  3. 对整个数据框执行此操作并对所有出现/变体求和
  4. 我的DF看起来像这样:

    id1 id2 content
    20  10  item 1
    20  10  item 2
    20  10  item 3
    30  20  item 4
    30  20  item 5
    30  20  item 6
    

    我需要了解以下内容:

    content  previous_content   sum_of_occurances
    item 4   item 1             1
    item 4   item 2             1
    item 4   item 3             1
    item 5   item 1             1
    item 5   item 2             1
    item 5   item 3             1
    item 6   item 1             1
    item 6   item 2             1
    item 6   item 3             1
    

    算什么人给我一个提示我应该如何在Python中处理它?我相当新,所以它可能是一个初学者级别的问题。先谢谢你。

1 个答案:

答案 0 :(得分:0)

输入:

from io import StringIO
import pandas as pd
df = pd.read_table(StringIO("""id1  id2  content
20  10  item 1
20  10  item 2
20  10  item 3
30  20  item 4
30  20  item 5
30  20  item 6"""), sep='  ', engine='python')

使用pd.merge(自)连接id1 / id2上的数据框,并在通用列中添加后缀:

merged_df = pd.merge(df, df, how='inner', left_on='id2', 
                     right_on='id1', suffixes=('','_previous'))
# Take essential columns
merged_df = merged_df[['content','content_previous']]

Groupby内容列,进行计数以获取出现的次数,重命名“索引”列:

# Reset index so we have something to count, then group by
grouped_df = merged_df.reset_index().groupby(['content','content_previous']).count()
# Reset index and change name of column
final_df = grouped_df.reset_index().rename(columns={'index':'sum_of_occurances'})  #There may be a better to get unique count across two columns

输出:

  content content_previous  sum_of_occurances
0  item 4           item 1                  1
1  item 4           item 2                  1
2  item 4           item 3                  1
3  item 5           item 1                  1
4  item 5           item 2                  1
5  item 5           item 3                  1
6  item 6           item 1                  1
7  item 6           item 2                  1
8  item 6           item 3                  1