列切片熊猫

时间:2018-07-26 15:38:04

标签: python python-3.x pandas dataframe

这是虚拟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

3 个答案:

答案 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}}将在数据帧的每一行上调用给定函数。因此,唯一的麻烦是编写该函数-我认为最好的解决方案是创建一个包含该行的1col_n_1或两者都不包含的列表,然后用逗号将列表连接起来。像这样:

col_n_2