【问题标题】:Pandas: Extract rows of a DF when a column value matches with a column value of another DFPandas:当列值与另一个 DF 的列值匹配时提取 DF 的行
【发布时间】:2018-12-10 17:27:31
【问题描述】:

我有两个 DF1 和 DF2,如下所述。两个数据框的第一列“POS”可能有匹配项,但其他列会有所不同。我想比较两个数据帧的“POS”列,如果 DF1 的“POS”值在 DF2“POS”列中,我想将该行存储在新的 DF1 数据帧中并对 DF2 执行相同的操作。通过将 POS 作为键并比较它们以获得相应的值,我可以很容易地使用字典。但是字典不会接受重复的 'POS' 值,所以我想知道 Pandas DF 中是否有解决方案。

df1 = 
   POS   id    freq
0 100 "idex" 3.0
1 102 "ter" 2.0
2 102 "pec" 4.0
3 103 "jek" 4.0
4 104 "jek" 4.0


df2 = 
   POS   id    freq
0 100 "treg" 3.0
1 102 "dfet" 2.2
2 102 "idet" 7.0
3 108 "jeik" 1.0
4 109 "jek" 4.0

Expected:
new_df1 = 
   POS   id    freq
0 100 "idex" 3.0
1 102 "ter" 2.0
2 102 "pec" 4.0


new_df2 = 
   POS   id    freq
0 100 "treg" 3.0
1 102 "dfet" 2.2
2 102 "idet" 7.0

【问题讨论】:

  • 您能否更好地使这些框架复制可粘贴?要么是完整列表,要么是粘贴 df.head() 的输出,而不是两者兼而有之。
  • 很抱歉。非常感谢您修复它们@sacul
  • 听起来您想在一个条件下加入(df1.POS==df2.POS)并保留第一个数据帧,然后对第二个数据帧执行相同的操作。是这样的程度吗?

标签: python pandas dataframe


【解决方案1】:

您可以将isin 用于两个数据框:

new_df1 = df1[df1.POS.isin(df2.POS)]

new_df2 = df2[df2.POS.isin(df1.POS)]

>>> new_df1
   POS    id  freq
0  100  idex   3.0
1  102   ter   2.0
2  102   pec   4.0
>>> new_df2
   POS    id  freq
0  100  treg   3.0
1  102  dfet   2.2
2  102  idet   7.0

【讨论】:

    【解决方案2】:

    我相信您正在描述一个经典的连接问题。 我会推荐.merge() 方法:

    df = pd.merge(df1, df2, how='left', on='POS')

    这将返回一个以 df1.POS 作为索引的新数据框。 df2 中的所有列都将在 df1 中,但仅适用于匹配的 POS 值。您可以在 oder 中使用how= 参数来获得所需的内容。欲了解更多信息,请参阅types of sql joins

    【讨论】:

      猜你喜欢
      • 2020-09-03
      • 2020-12-13
      • 2016-09-19
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 2019-02-12
      • 2019-11-02
      • 1970-01-01
      相关资源
      最近更新 更多