【发布时间】: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