这是虚拟DataFrame:
d = {'col_1': [1, 2], 'col_n_1': [3, 4], 'col_2': [2, 1], 'col_n_2': [6, 3]}
df = pd.DataFrame(data=d)
col_1 col_2 col_n_1 col_n_2
0 1 2 3 6
1 2 1 4 3
2 1 1 4 5
我正在寻找一种不错的方法来从col_n_1
的{{1}}和col_1 == 1
的{{1}}提取值
在新的列中看起来像:
col_n_2
答案 0 :(得分:3)
使用where
通过掩码获取值,然后将join
列一起使用:
L = ['col_1','col_2']
L1 = ['col_n_1','col_n_2']
df['new'] = (df[L1].astype(str).where(df[L].eq(1).values, axis=1)
.apply(lambda x: ','.join(x.dropna()), 1))
仅2列的解决方案:
L = ['col_1','col_2']
L1 = ['col_n_1','col_n_2']
df1 = df[L1].astype(str).where(df[L].eq(1).values, axis=1)
df['new'] = (df1['col_n_1'] .fillna('') + ',' + df1['col_n_2'] .fillna('')).str.strip(',')
或者先添加,
然后再添加sum
的解决方案,最后删除结尾的,
:
df['new'] = (df[L1].astype(str).where(df[L].eq(1).values)
.add(', ')
.fillna('')
.sum(axis=1)
.str.strip(', '))
print (df)
col_1 col_2 col_n_1 col_n_2 new
0 1 2 3 6 3
1 2 1 4 3 3
2 1 1 4 5 4,5
答案 1 :(得分:2)
从耶兹(Jez)借用名字列表
df[L].eq(1).rename(columns=dict(zip(L,L1))).mul((df[L1].astype(str)+',')).sum(1).str[:-1]
Out[126]:
0 3
1 3
2 4,5
dtype: object
答案 2 :(得分:0)
这可以通过apply()
方法和lambda函数来完成。将apply()
参数设置为index
的{{1}}将在数据帧的每一行上调用给定函数。因此,唯一的麻烦是编写该函数-我认为最好的解决方案是创建一个包含该行的1
或col_n_1
或两者都不包含的列表,然后用逗号将列表连接起来。像这样:
col_n_2