【问题标题】:List comprehension to get rows from a dataframe that contains matching column values of another dataframe列表理解以从包含另一个数据帧的匹配列值的数据帧中获取行
【发布时间】:2020-10-15 19:15:22
【问题描述】:

所以我有 2 个截然不同的数据框——不同的列名,不同的数据。 两者都有一个包含一些匹配数字的列。我试图将 list comp 与 any() 语句一起使用,但没有成功,合并/加入是一团糟,没有重命名所有内容。这是我正在做的一个小例子:

df1 = pd.DataFrame(np.random.randint(0,100,size=(5, 5)), columns=list('ABCDE'))
df2 = pd.DataFrame(np.random.randint(0,100,size=(5, 5)), columns=list('FGHIJ'))

match = [x for x in df1['B'] if any(y in x for y in df2['K'])]
df_match = df1[match]

这总是给我所有True 值的输出,或者我得到一个空列表。 有点迷失了,只是试图获取 df1.B 与 df2.K 匹配的 df1 行,并且需要与我的海量数据集的列表理解一样快或更快的东西。

编辑:我应该补充一点,数据框中的这些“数字”都是字符串(“24”)。 几周前我在丢失代码之前解决了这个问题,我记得使用带有 any() 的列表理解来让它工作,但不记得我在语法上做了什么):

【问题讨论】:

  • df1[df1['B'].isin(df2['K'])]['B'] 是否满足您的需求?
  • 感谢您的回复,它似乎只是返回了一个空的 df,其中包含 df1 的所有列名
  • B列和K列有共享值吗?如果您可以展示一个并非每次随机生成的样本数据框,以及基于该输入的预期输出,这将有助于提供更有用的答案
  • 是的,只是顺着列表往下计算,我在前 60-70 个数字中看到了十几个或更多。
  • 使用布尔掩码和内置方法.isin() 通常是解决此问题的更有效方法之一。您确定这些值匹配吗?您确定它们不是一个 DF 中的数字和另一个中的字符串吗?这适用于我运行的任何测试,例如 df2 = pd.DataFrame({'a':[1,2,3,4,5],'b':[6,7,8,9,0]});df3 = pd.DataFrame({'c':[1,3,5,7,9],'d':[2,4,6,8,0]}) 然后 df2[df2['b'].isin(df3['d'])] 返回行 0,2,4

标签: python pandas dataframe list-comprehension any


【解决方案1】:

我猜你真正想写的是

df1 = pd.DataFrame(np.random.randint(0,2,size=(10, 5)), columns=list('ABCDE'))
df2 = pd.DataFrame(np.random.randint(0,2,size=(10, 5)), columns=list('EFGHI'))

由于我的 dfs 有一个共享列,我们知道我们要寻求一致的内容,并且由于值是 0 和 1,它们可能会不时达成一致:)。

现在

df1["E"]==df2["E"]

为您提供一系列真假值。如果 dfs 在 e 列中同意,则为 true,否则为 false。现在,如果您想要这种情况的行 df1[df1["E"]==df2["E"]]df2[df1["E"]==df2["E"]]. 如果要合并 dfs,则必须重置索引并像这样加入它们

df1[df1["E"]==df2["E"]].reset_index(drop=True)\
.join(df2[df1["E"]==df2["E"]].reset_index(drop=True)[["F","G","H"]])

请注意,我必须删除 df2 中的 E 列,因为它重叠了。

因为在实际问题中似乎是这种情况,所以这里有一个具有不同命名列的版本:

df1 = pd.DataFrame(np.random.randint(0,2,size=(10, 5)), columns=list('ABCDE'))
df2 = pd.DataFrame(np.random.randint(0,2,size=(10, 5)), columns=list('FGHIJ'))


df1[df1["E"]==df2["E"]].reset_index(drop=True)\
.join(df2[df1["E"]==df2["F"]].reset_index(drop=True)[["G","H","I"]])

请注意,对于[["G","H","I"]],我在加入之前已从 df2 中删除了 F 列,因为这将是冗余信息。通过选择行,E 和 F 列必须包含完全相同的信息。

【讨论】:

  • 所以我的列实际上标记不同。在这种情况下,我无法在不破坏脚本其他部分的情况下更改列名,我可以重命名,但这不是最好的。我之前解决了这个问题,并且在删除 VM 时丢失了我的代码。我几乎可以肯定地将 List Comprehension 与 any() 语句一起使用,但不记得我做了什么。
  • 没问题我会加一个版本的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多