【问题标题】:How to Update Value in First N Rows by Group in a Multi-Index Pandas Dataframe?如何在多索引 Pandas 数据框中按组更新前 N 行中的值?
【发布时间】:2014-09-08 09:37:31
【问题描述】:

我正在尝试更新多索引数据框中的前 N ​​行,但在找到解决方案时遇到了一些麻烦,所以我想为它创建一个帖子。

示例代码如下:

# Imports
import numpy as np
import pandas as pd

# Set Up Data Frame
dates = pd.date_range('1/1/2000', periods=8)
df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B', 'C', 'D'])
df['DATE'] = dates
df['CATEGORY'] = ['A','B','A','B','A','B','A','B']

# Set Index
df.set_index(['CATEGORY','DATE'],inplace=True)
df.sort(inplace=True)

# Get First Two Rows of Each Category
df.groupby(level=0).apply(lambda x: x.iloc[0:2])

# Set The Value of Column 'C' Equal to Zero
# ???

所以我能够使用“iloc”选择行,但之后我不确定如何将“C”列设置为零。感觉就像我可能会以错误的方式去做。任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    这个怎么样 - 首先定义一个接受数据帧的函数,并用指定的值替换前 x 条记录。

    def replace_first_x(group_df, x, value):
        group_df.iloc[:x, :] = value
        return group_df
    

    然后,使用 apply 将其传递给 groupby 对象。

    In [97]: df.groupby(level=0).apply(lambda df: replace_first_x(df, 2, 9999))
    Out[97]: 
                                   A            B            C            D
    CATEGORY DATE                                                          
    A        2000-01-01  9999.000000  9999.000000  9999.000000  9999.000000
             2000-01-03  9999.000000  9999.000000  9999.000000  9999.000000
             2000-01-05     1.590503     0.948911    -0.268071     0.622280
             2000-01-07    -0.493866     1.222231     0.125037     0.071064
    B        2000-01-02  9999.000000  9999.000000  9999.000000  9999.000000
             2000-01-04  9999.000000  9999.000000  9999.000000  9999.000000
             2000-01-06     1.663430    -1.170716     2.044815    -2.081035
             2000-01-08     1.593104     0.108531    -1.381218    -0.517312
    

    【讨论】:

    • 感谢 chrisb/FooBar,这正是我想要的。欣赏经验法则以及 FooBar - 这很有帮助。
    【解决方案2】:

    通常,当您必须更改 值而不是仅仅选择它们时,您不能仅使用lambda 函数继续进行,因为它们只允许选择。

    一个非常简单的方法是

    def replace_first(group):
        group.iloc[0:2] = 99
        return group
    

    然后就做

    In[144]: df.groupby(level=0).apply(replace_first)
    Out[144]: 
                                 A          B          C          D
    CATEGORY DATE                                                  
    A        2000-01-01  99.000000  99.000000  99.000000  99.000000
             2000-01-03  99.000000  99.000000  99.000000  99.000000
             2000-01-05   0.458031   1.959409   0.622295   0.959019
             2000-01-07   0.934521  -2.016685   1.046456   1.489070
    B        2000-01-02  99.000000  99.000000  99.000000  99.000000
             2000-01-04  99.000000  99.000000  99.000000  99.000000
             2000-01-06  -0.117322  -1.664436   1.582124   0.486796
             2000-01-08  -0.225379   0.794846  -0.021214  -0.510768
    

    【讨论】:

    • 如果您只想更改一列的值怎么办?
    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 2020-06-21
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2015-06-12
    相关资源
    最近更新 更多