我有一个数据帧,其结构如下
code value
1 red
2 blue
3 yellow
1
4
4 pink
2 blue
所以基本上我想更新值列,以便空白行中填充其他行中的值。所以我知道代码4指的是值pink,我希望在不存在该值的所有行中对其进行更新。
答案 0 :(得分:4)
使用groupby
和ffill
和bfill
df.groupby('code').value.ffill().bfill()
0 red
1 blue
2 yellow
3 red
4 pink
5 pink
6 blue
Name: value, dtype: object
答案 1 :(得分:4)
您可以使用给定first
组的code
值
In [379]: df.groupby('code')['value'].transform('first')
Out[379]:
0 red
1 blue
2 yellow
3 red
4 pink
5 pink
6 blue
Name: value, dtype: object
分配回来
In [380]: df.assign(value=df.groupby('code')['value'].transform('first'))
Out[380]:
code value
0 1 red
1 2 blue
2 3 yellow
3 1 red
4 4 pink
5 4 pink
6 2 blue
或
df['value'] = df.groupby('code')['value'].transform('first')
答案 2 :(得分:3)
您可以创建一系列code
-value
对,并将其用于map
:
my_map = df[df['value'].notnull()].set_index('code')['value'].drop_duplicates()
df['value'] = df['code'].map(my_map)
>>> df
code value
0 1 red
1 2 blue
2 3 yellow
3 1 red
4 4 pink
5 4 pink
6 2 blue
只需查看发生了什么,您就将以下系列传递给map
:
>>> my_map
code
1 red
2 blue
3 yellow
4 pink
Name: value, dtype: object
它说:“在找到1
的地方,给值red
,在找到2
的地方,给blue
...”
答案 3 :(得分:2)
您可以依次sort_values
,ffill
和sort_index
。如果顺序不重要,则可能不需要最后一步。如果是这样,那么双重排序可能会不合理地昂贵。
df = df.sort_values(['code', 'value']).ffill().sort_index()
print(df)
code value
0 1 red
1 2 blue
2 3 yellow
3 1 red
4 4 pink
5 4 pink
6 2 blue
答案 4 :(得分:2)
使用reindex
df.dropna().drop_duplicates('code').set_index('code').reindex(df.code).reset_index()
Out[410]:
code value
0 1 red
1 2 blue
2 3 yellow
3 1 red
4 4 pink
5 4 pink
6 2 blue