熊猫多索引数据框将列的第一行设置为0

加内什·桑达尔

我在处理熊猫中的分组对象时遇到一些麻烦。具体来说,我希望能够将一列中的第一行设置为0,同时保持其他行不变。

例如:

df = pd.DataFrame({'A': ['foo', 'bar', 'baz'] * 2,
                        'B': rand.randn(6),
                        'C': rand.rand(6) > .5})

给我

    A         B      C
0  foo  1.624345  False
1  bar -0.611756   True
2  baz -0.528172  False
3  foo -1.072969   True
4  bar  0.865408  False
5  baz -2.301539   True

我将它们按A分组,然后按B排序:

f = lambda x: x.sort('B', ascending=True)
sort_df = df.groupby('A',sort=False).apply(f)

得到这个:

         A         B      C
    A                          
foo 3  foo -1.072969   True
    0  foo  1.624345  False
bar 1  bar -0.611756   True
    4  bar  0.865408  False
baz 5  baz -2.301539   True
    2  baz -0.528172  False

现在有了组,我希望能够将每个组中的第一个元素设置为0。我该怎么做?

这样的事情会起作用,但是我想要一种更优化的方法:

for group in sort_df.groupby(level=0).groups:
    sort_df.loc[(group,sort_df.loc[group].index[0]),'B']=0

任何帮助将不胜感激,谢谢!

杰夫

这是执行此操作的矢量化方法。会更快

In [26]: pd.set_option('max_rows',10)

创建一个具有2级多索引的框架,按A排序(此处是任意的)

In [27]: df = DataFrame(dict(A = np.random.randint(0,100,size=N),B=np.random.randint(0,100,size=N),C=np.random.randn(N))).sort(columns=['A'])

In [28]: df
Out[28]: 
        A   B         C
61474   0  40 -0.731163
82386   0  18 -1.316136
63372   0  28  0.112819
49666   0  13 -0.649491
31631   0  89 -0.835208
...    ..  ..       ...
42178  99  28 -0.029800
59529  99  31 -0.733588
13503  99  60  0.672754
20961  99  18  0.252714
31882  99  22  0.083340

[100000 rows x 3 columns]

重置索引以捕获索引值。根据B查找第一个值

In [29]: grouped = df.reset_index().groupby('B').first()

In [30]: grouped
Out[30]: 
    index  A         C
B                     
0   26576  0  1.123605
1   38311  0  0.128966
2   45135  0 -0.039886
3   38434  0 -1.284028
4   82088  0 -0.747440
..    ... ..       ...
95  82620  0 -1.197625
96  63278  0 -0.625400
97  23226  0 -0.497609
98  82520  0 -0.828773
99  35902  0 -0.199752

[100 rows x 3 columns]

这使您可以索引框架。

In [31]: df.loc[grouped['index']] = 0

In [32]: df
Out[32]: 
        A   B         C
61474   0   0  0.000000
82386   0   0  0.000000
63372   0   0  0.000000
49666   0   0  0.000000
31631   0   0  0.000000
...    ..  ..       ...
42178  99  28 -0.029800
59529  99  31 -0.733588
13503  99  60  0.672754
20961  99  18  0.252714
31882  99  22  0.083340

[100000 rows x 3 columns]

如果你想

In [33]: df.sort_index()
Out[33]: 
        A   B         C
0      40  56 -1.223941
1      24  77 -0.039775
2       7  83  0.741013
3      48  38 -1.795053
4      62  15 -2.734968
...    ..  ..       ...
99995  20  25 -0.286300
99996  27  21 -0.120430
99997   0   4  0.607524
99998  38  31  0.717069
99999  33  63 -0.226888

[100000 rows x 3 columns]

这个方法

In [34]: %timeit df.loc[grouped['index']] = 0
100 loops, best of 3: 7.33 ms per loop

你原来的

In [37]: %timeit df.groupby('A',sort=False).apply(f)
10 loops, best of 3: 109 ms per loop

如果您有更多的组,此性能差异将扩大。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

熊猫-如何将多索引数据框中的列缩放到每个级别= 0组中的第一行

将列表追加到熊猫数据框的第一行和第一列

熊猫:如何获取数据框第一行和最后一行的键(索引)

熊猫将多键值数据框列重塑为行

获取带有索引的熊猫数据框第一行

在熊猫数据框中的组中制作索引第一行

通过使用新的多索引重复一行来创建熊猫数据框

如何在每个组的多索引数据框中删除第一行?

在熊猫数据框中为每个组添加第一行

如何将熊猫数据框的值除以第一行的每一组?

将嵌套的熊猫数据框分解为列,并为其每一行重复父行

如何将熊猫数据框的索引设置为列长度的索引?

在第一行的多列中插入0的逻辑-熊猫

如何为熊猫数据框的每一行打印索引值,列名和列数据?

如何将数据框的第一行读取为数据行而不是标题

熊猫将第一行设置为MultiIndex Level 1

设置熊猫数据框中的多索引列的顺序

熊猫数据框groupby并填充第一行值

熊猫数据框获取每个组的第一行

将熊猫数据框的第一行转换为列名

熊猫数据框。将元组值扩展为具有多索引的列

熊猫:为多索引数据框的所有行分配一个列表

向索引的数据框熊猫添加一行

移动一行熊猫数据框但索引不变

如何将熊猫数据框的索引日期(最后一行)存储在变量中?

熊猫数据框中得到面膜列的零(0)之间的所有行,并得到各组的第一和最后一行

熊猫数据框-获取列索引以获取一行中的最小值

如何在熊猫数据框中将具有无序索引的行移动到第一行?

将Pandas多索引数据框重塑为多列