根据groupby操作的索引将值分配给pandas列

时间:2017-10-03 06:28:53

标签: pandas-groupby

我有一个像这样的数据框:

rng = np.random.RandomState(0)
tf = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],
                   'data1': [1,2,3,2,2,3],
                   'data2': rng.randint(0, 10, 6)},
                   columns = ['key', 'data1', 'data2'])
tf


   key  data1   data2
0   A   1   5
1   B   2   0
2   C   3   3
3   A   2   3
4   B   2   7
5   C   3   9

如果我有一个数组x = np.arange(4),其长度与列[' key',' data1']中的组数相同。

grouped = tf.groupby(['key', 'data1'])
print(grouped.get_group(('A', 1)), '\n')
print(grouped.get_group(('A', 2)), '\n')
print(grouped.get_group(('B', 2)), '\n')
print(grouped.get_group(('C', 3)), '\n')

 key  data1  data2
0   A      1      5 

  key  data1  data2
3   A      2      3 

  key  data1  data2
1   B      2      0
4   B      2      7 

  key  data1  data2
2   C      3      3
5   C      3      9 

现在,有4组,我有一个矢量' x'长度为4.我想将x [i]分配给第i组的所有数据行2,我想对数据帧的所有行执行此操作。我正在尝试使用apply(),但是不能太过分。我终于找到了一种使用循环和掩码的方法,但是在处理大型数据帧时这非常慢。任何人都可以指出这样做的正确方法吗?

1 个答案:

答案 0 :(得分:0)

好的,管理的解决方案比使用蒙版更快。这对我来说现在很有用。

unique_groups=tf.loc[:,"key":"data1"].drop_duplicates(
                                          subset['key','data1']).values
grouped = tf.groupby(['key', 'data1'])
for i in range(len(unique_groups)):
    tf.loc[grouped.get_group(tuple(unique_groups[i])).index, 'data2'] = x[i]

但是这仍然有循环,并且仍然比任何本机熊猫功能花费更多的时间。是否有本地熊猫的方法来做到这一点?