假设我有下表。
import pandas as pd
sales = {'Account': ['Jones LLC', 'Alpha Co', 'Blue Inc'],
'1': ['a', 'b', 'c'],
'2': ['', 'e, g', 'f, h'],
'3': ['a', 'g', 'h']}
df = pd.DataFrame.from_dict(sales).set_index('Account')
df
输出:
1 2 3
Account
Jones LLC a a
Alpha Co b e, g g
Blue Inc c f, h h
我想创建另一个列'4',结果是第1,2和3列的组合:
1 2 3 4
Account
Jones LLC a a a
Alpha Co b e, g g b, e, g
Blue Inc c f, h h c, f, h
我尝试使用以下内容:
df['4'] = [', '.join([df['1'][x],df['2'][x],df['3'][x]]) for x in range(df.shape[0])]
输出:
1 2 3 4
Account
Jones LLC a a , a
Alpha Co b e, g g b, e, g, g
Blue Inc c f, h h c, f, h, h
问题是:
, a
而不是a
b, e, g, g
而不是b, e, g
df['1'][x], df['2'][x], df['3'][x]
而不是定义列表['1','2','3']
并迭代列表。我想知道是否有一种快速的方法可以在不使用df.iterrows()
的情况下执行此操作,检查是否有任何条目为空,然后根据需要进行组合?
答案 0 :(得分:2)
看起来您需要排除空列,然后删除重复项。
<强>代码:强>
df['4'] = [', '.join(sorted(set(sum(
[[y.strip() for y in df[c][x].split(',')]
for c in '123' if df[c][x].strip()], []))))
for x in range(df.shape[0])]
测试代码:
import pandas as pd
sales = {'Account': ['Jones LLC', 'Alpha Co', 'Blue Inc'],
'1': ['a', 'b', 'c'],
'2': ['', 'e, g', 'f, h'],
'3': ['a', 'g', 'h']}
df = pd.DataFrame.from_dict(sales).set_index('Account')
df['4'] = [', '.join(sorted(set(sum(
[[y.strip() for y in df[c][x].split(',')]
for c in '123' if df[c][x].strip()], []))))
for x in range(df.shape[0])]
<强>结果:强>
1 2 3 4
Account
Jones LLC a a a
Alpha Co b e, g g b, e, g
Blue Inc c f, h h c, f, h
答案 1 :(得分:1)
替代解决方案:
In [59]: df[4] = (df.replace(r'[\s,]*','',regex=True)
...: .sum(1)
...: .str.extractall(r'(.)')
...: .unstack()
...: .apply(lambda x: ','.join(set(x.dropna())), axis=1))
...:
In [60]: df
Out[60]:
1 2 3 4
Account
Jones LLC a a a
Alpha Co b e, g g b,e,g
Blue Inc c f, h h c,f,h