【问题标题】:Python & Pandas: Value lookup and extraction between columnsPython & Pandas:列之间的值查找和提取
【发布时间】:2017-10-15 15:29:43
【问题描述】:

编辑:我只是在寻找有关如何解决此问题的提示

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

逻辑应该是这样的:

  1. 查找id2中是否有id1的匹配值。
  2. 如果有匹配项,列出与 id1 匹配的所有内容值,并为每个单独的值分配与 id2 匹配的所有值
  3. 对整个数据框执行此操作并汇总所有出现/变化

我的 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

Count 有人给我一个提示,我应该如何在 Python 中处理它?我很新,所以这可能是一个初学者级别的问题。提前谢谢你。

【问题讨论】:

  • 到目前为止您尝试过什么?发布您到目前为止编写的代码,以及哪里出错了。如果您可以稍微充实一下边缘情况,那也会很有帮助。比如id1id2不匹配怎么处理df中的数据? sum_of_occurrences 大于 1 的例子是什么?您的数据中代表的“个人”是什么?你所说的“总和......变体”是什么意思,变体和发生之间有什么区别?
  • 嗨 Andrew,实际上我并没有走多远,因为我在创建内容中出现的唯一项目数组后一开始就被卡住了,我想用这些项目来检测匹配的 id1 和 id2s,但是是新的,这就是我已经走了多远。回答您的问题:如果 id1 和 id2 之间不匹配,请移至下一个 id1。 sum_of_occurances 表示如果项目组合出现多次,则该值将大于 1。单个值 = 对应于 id1 的任何项目。变化和发生是一回事。你有什么想法我该如何解决? :-)
  • 您可能会通过Minimal, Complete, and Verifiable example(或至少尽可能接近)获得更好、更快的帮助。包括用于构建初始数据框的代码,以及涵盖您关心的所有条件的示例输入和所需输出。 SO上的人们往往对“为我做这个”的问题有点敏感,而不是“我已经做到了这一步,这就是我所做的,你能告诉我哪里出了问题吗?”这是一条很好的路线,当然 - 但你越能瞄准 MCVE,越好。
  • 谢谢你,我不想让任何人为我做这件事,只是为我指出正确的方向,但是是的,我想我知道你的意思。
  • 嘿 Luna - 和 Andrew 一样,我在弄清楚你想要什么样的输出时遇到了一些麻烦。您的第二个数据帧是否真的代表了您对处理第一个数据帧的期望结果?因为第一个数据帧没有任何行与id1id2 匹配,但 sum 列确实在第二个数据帧中有值。

标签: python pandas dataframe lookup extraction


【解决方案1】:

输入:

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 (self) 加入 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

【讨论】:

    猜你喜欢
    • 2016-08-24
    • 1970-01-01
    • 2013-11-22
    • 2023-04-08
    • 1970-01-01
    • 2019-02-25
    • 2018-05-08
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多