我正在寻找一种从查找数据框中动态添加列的方法,假设我有这个例子:
import pandas as pd
df = pd.DataFrame({'col1': ["monkey", "monkye", "ape", "banana", "apple", "aple"],
'col2': ["apple", "banana", "", "banana", "", ""],
'col3': ["monkey", "apple", "pear", "", "apple", "aple"]})
monkey = pd.DataFrame({0: ["monkey", "monkye", "etc..", "etc.."]})
apple = pd.DataFrame({0: ["apple", "aple", "etc..", "etc.."]})
banana = pd.DataFrame({0: ["banana", "bananaa", "etc..", "etc.."]})
dataframes = [banana, apple, monkey]
for dataframe in dataframes:
df[['a','b','c']] = df[['col1', 'col2', 'col3']].isin(dataframe[0])
print df
因此,这将打印df[['a','b','c']]
一直被替换的地方:
col1 col2 col3 a b c
0 monkey apple monkey True False True
1 monkye banana apple True False False
2 ape pear False False False
3 banana banana False False False
4 apple apple False False False
5 aple aple False False False
但我所追求的是一栏香蕉,一栏是苹果,一栏是猴子,所以看起来像这样:
col1 col2 col3 banana apple monkey
0 monkey apple monkey False True True
1 monkye banana apple True True True
2 ape pear False False False
3 banana banana True False False
4 apple apple False True False
5 aple aple False True False
答案 0 :(得分:2)
我相信您需要定义DataFrames
及其名称的元组列表,然后将转换列与列表进行比较,并按DataFrame.any
检查每行至少一个True
:
dataframes = [('banana', banana), ('apple',apple), ('monkey',monkey)]
for k, v in dataframes:
df[k] = df[['col1', 'col2', 'col3']].isin(v[0].tolist()).any(axis=1)
print (df)
col1 col2 col3 banana apple monkey
0 monkey apple monkey False True True
1 monkye banana apple True True True
2 ape pear False False False
3 banana banana True False False
4 apple apple False True False
5 aple aple False True False
如果订单不重要,请使用dictionary
:
dataframes = {'banana': banana, 'apple':apple, 'monkey':monkey}
for k, v in dataframes.items():
df[k] = df[['col1', 'col2', 'col3']].isin(v[0].tolist()).any(1)
print (df)
col1 col2 col3 apple banana monkey
0 monkey apple monkey True False True
1 monkye banana apple True True True
2 ape pear False False False
3 banana banana False True False
4 apple apple True False False
5 aple aple True False False
答案 1 :(得分:2)
解决方案1:
使用交集来查看行中是否存在任何有效拼写。如果dataframes
是dict
而非list
dataframes = {'monkey': monkey, 'banana': banana, 'apple': apple}
df.assign(
**{k: df.apply(lambda x: np.intersect1d(x.values, v.values).size > 0, axis=1)
for k, v in dataframes.items()}
)
输出:
col1 col2 col3 apple banana monkey
0 monkey apple monkey True False True
1 monkye banana apple True True True
2 ape pear False False False
3 banana banana False True False
4 apple apple True False False
5 aple aple True False False
然后您可以将其分配回原始变量(覆盖df)或其他变量。
解决方案2:
另一种选择是使用正则表达式进行匹配。
导入重新 patterns = {'apple':re.compile(r'apple | aple | etc .. | etc ..'), '猴子':re.compile(r'monkey | monkye | etc .. | etc ..'), 'banana':re.compile(r'banana | bananaa | etc .. | etc ..')}
df.assign(
**{k: df.apply(lambda x: True if re.match(p, ' '.join(x.values)) else False, axis=1)
for k, p in patterns.items()}
)
输出相同。但是,正则表达式将为您提供更灵活的匹配环境。