我有一个python字典
{1:cat,
2:dog,
3:sheep,
4:foo,
5:bar,
6:fish,
7:lion,
8:shark,
9:zebra,
10:snake}
我也有如下熊猫数据框
df
:
ID col1 col2 col2 col4
18938 1 Nan 5 Nan
17839 Nan 2 Nan 8
72902 3 5 9 Nan
78298 7 Nan Nan 6
现在,我尝试替换或映射字典中的每一列中每个单元格的值,并尝试将所有列值concat
移至新列。
新的df
应该如下所示:
ID col1 col2 col2 col4 new_col
18938 cat Nan bar Nan cat|bar
17839 Nan dog Nan shark dog|shark
72902 sheep bar zebra Nan sheep|bar|zebra
78298 lion Nan Nan fish lion|fish
我正在尝试实现第二步,即使用代码concat
所有列
df['new_col'] = df.drop('ID',1).agg(lambda x: '|'.join(x.dropna().astype(str).values), axis=1)
但是我无法开始第一步
我用过
df = df.columns.map(dict)
但这并没有给我所需的预期答案。
答案 0 :(得分:2)
使用df.replace()
:
df = df.replace(dict)
请注意,如果字典中的键是字符串,则可能需要regex=True
:
df = df.replace(dict, regex=True)
示例:
import pandas as pd
d = {1:"cat",
2:"dog",
3:"sheep",
4:"foo",
5:"bar",
6:"fish",
7:"lion",
8:"shark",
9:"zebra",
10:"snake"}
df = pd.DataFrame({'ID': [123, 456], 'col1': [1, 2], 'col2': [5, 6]})
df = df.replace(d)
print(df)
输出:
ID col1 col2
0 123 cat bar
1 456 dog fish
答案 1 :(得分:2)
您可以尝试以下方法:
df = df.set_index('ID')
d1 = pd.concat([df[i].replace('Nan',pd.np.nan).dropna().astype(int).map(d) for i in df.columns], axis=1)
d1['new_col'] = d1.apply(lambda x: '|'.join(x.dropna()), axis=1)
print(d1)
或者,如果您想要更慢但更简洁的代码:
d1 = df.apply(lambda x: x.replace('Nan',pd.np.nan).dropna().astype(int).map(d))
d1['new_col'] = d1.apply(lambda x: '|'.join(x.dropna()), axis=1)
d1
输出:
col1 col2 col2.1 col4 new_col
ID
17839 NaN dog NaN shark dog|shark
18938 cat NaN bar NaN cat|bar
72902 sheep bar zebra NaN sheep|bar|zebra
78298 lion NaN NaN fish lion|fish