有条件地将某些行值复制到其他行

时间:2018-10-24 11:04:34

标签: python pandas

我有一个具有以下结构的数据框:

    code name age char
    101  NaN  NaN  ts
    101  NaN  NaN  tt
    101  Carl 19   tt
    102  NaN  NaN  ts
    102  NaN  NaN  tt
    102  NaN  NaN  tt
    103  NaN  NaN  ts
    103  Aoi  23   tt
    103  NaN  NaN  tt

我想将“名称”和“年龄”列中的值复制到其他存在条件的行,条件是它们具有相同的“代码”和“字符”为“ ts”。 我想要的结果数据帧如下:

    code name age char
    101  Carl 19   ts
    101  NaN  NaN  tt
    101  Carl 19   tt
    102  NaN  NaN  ts
    102  NaN  NaN  tt
    102  NaN  NaN  tt
    103  Aoi  23   ts
    103  Aoi  23   tt
    103  NaN  NaN  tt

预先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

使用GroupBy.apply前后填充缺少的值ànd,然后通过布尔掩码设置值:

cols = ['name','age']
df1 = df.groupby(['code'])[cols].apply(lambda x: x.ffill().bfill())

mask = df['char'] == 'ts'
df.loc[mask, cols] = df1.loc[mask, cols]
print (df)
   code  name   age char
0   101  Carl  19.0   ts
1   101   NaN   NaN   tt
2   101  Carl  19.0   tt
3   102   NaN   NaN   ts
4   102   NaN   NaN   tt
5   102   NaN   NaN   tt
6   103   Aoi  23.0   ts
7   103   Aoi  23.0   tt
8   103   NaN   NaN   tt

答案 1 :(得分:1)

一行:

result = df.copy()

result.update(df.groupby(['code']).bfill()[df['char']=='ts'])

result

    code  name   age char
0  101.0  Carl  19.0   ts
1  101.0   NaN   NaN   tt
2  101.0  Carl  19.0   tt
3  102.0   NaN   NaN   ts
4  102.0   NaN   NaN   tt
5  102.0   NaN   NaN   tt
6  103.0   Aoi  23.0   ts
7  103.0   Aoi  23.0   tt
8  103.0   NaN   NaN   tt

解释

通过执行以下操作,用'char' == 'ts'行填充数据框,这些行已用以下代码填充了所有可用值:

df.groupby(['code']).bfill()
   code  name   age char
0   101  Carl  19.0   ts
1   101  Carl  19.0   tt
2   101  Carl  19.0   tt
3   102   NaN   NaN   ts
4   102   NaN   NaN   tt
5   102   NaN   NaN   tt
6   103   Aoi  23.0   ts
7   103   Aoi  23.0   tt
8   103   NaN   NaN   tt


df.groupby(['code']).bfill()[df['char']=='ts']

   code  name   age char
0   101  Carl  19.0   ts
3   102   NaN   NaN   ts
6   103   Aoi  23.0   ts
相关问题