更新现有的数据框列

时间:2018-08-29 15:53:32

标签: python python-2.7 pandas dataframe

我有一个数据帧,其结构如下

code      value
1          red
2          blue 
3          yellow
1
4          
4          pink
2          blue

所以基本上我想更新值列,以便空白行中填充其他行中的值。所以我知道代码4指的是值pink,我希望在不存在该值的所有行中对其进行更新。

5 个答案:

答案 0 :(得分:4)

使用groupbyffillbfill

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_valuesffillsort_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