【问题标题】:Compare list of tuples against column in dataframe将元组列表与数据框中的列进行比较
【发布时间】:2021-03-03 23:03:12
【问题描述】:

我正在学习 pandas,但有一个无法解决的问题。

我有一个大约 200k 行的数据框,是 id 的列之一。它看起来像这样:

    call_id id      utterance   channel  seq    sentiment
0     uuid            str         str    str      float

我还有一个具有这种形状的元组列表:

(id, pattern_id)
tup = [('c638b6fe-0939-4a3b-a7f0-c9b315da1e5d', '56e1542f-5d68-4fe0-a85a-cce8ae1f0b94'),...]

作为这些元素的字符串。

我想将数据帧每一行中的 id 与元组列表中的 id 进行比较,如果匹配,请将匹配元组的 pattern_id 添加到数据帧的新列中。 元组列表的长度不等于数据框中的行数。

我尝试了不同的方法,但其中任何一种都可以正常工作。 看来我可以进行比较,例如:

matches = []
for row in df.itertuples():
    for t in tuples:
        if row.id == t[0]:
            matches.append(t[1])

我得到了我必须得到的比赛。但如果我添加一个 else 比较似乎不起作用:

matches = []
for row in df.itertuples():
    for t in tuples:
        if row.id == t[0]:
            matches.append(t[1])
        else:
            matches.append("nan")

如果有任何帮助理解,我将不胜感激:

  • 为什么这不起作用
  • 如何将每行的比较结果添加到数据框中的新列中。

谢谢!

【问题讨论】:

  • 请发布数据框示例和包含元组列表的示例。
  • 我已添加信息

标签: python pandas dataframe tuples


【解决方案1】:

您可以从元组列表中创建一个数据框,如下所示: df = pd.DataFrame(list_of_tuples, columns =['id', 'pattern_id']) 然后将其与主数据框连接起来,如下所示: joined = main_df.merge(df, on='id', how='inner')pattern_id 包含在 joined 中,用于匹配 id 的行。

【讨论】:

  • 成功了,谢谢!我想知道这是否是一种合并两个数据帧的方法,结果 df 包含所有行,有或没有匹配?如果不匹配,则 pattern_id 类似于“N/A”。这可能吗?
  • 然后你可以改变how关键字参数。 how='left' 会给你所有的 main_df 行。它的工作方式类似于 SQL 连接。
猜你喜欢
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
相关资源
最近更新 更多