python - 根据条件创建求和行

标签 python python-3.x pandas dataframe sum

我有一个大型数据框,其中包含美国各州和县的日期和数字。我想要做的是创建一个新行 state基于 county 的级别总和每天的等级数。

示例数据框,假设有更多行和列:

date        state.  county.  sales .....
2020-01-22. CA      1        100
2020-01-22. CA      2        100
2020-01-22  FL      3        100
2020-01-22  FL      6        100
2020-01-22  NY      9        100
2020-01-22  NY      7        100
2020-01-23  CA      2        200
2020-01-23  FL      2        400
2020-01-23  NY      2        300
2020-01-24  CA      3        600
2020-01-24  FL      3        700
2020-01-24  NY      3        100
.
.
.

county数字是任意的。我想做的是为 each day 创建一个新行对于 each statesales 的总和为此day所有其他列都可以为空。州的求和行不应包含任何县,以便它表示其州级别。

结果数据框:

date        state.  county.  sales .....
2020-01-22. CA      1        100
2020-01-22. CA      2        100
2020-01-22  FL      3        100
2020-01-22  FL      6        100
2020-01-22  NY      9        100
2020-01-22  NY      7        100
2020-01-23  CA      2        200
2020-01-23  FL      2        400
2020-01-23  NY      2        300
2020-01-24  CA      3        600
2020-01-24  FL      3        700
2020-01-24  NY      3        100
2020-01-22. CA               200
2020-01-22. FL               200
2020-01-22. NY               200
.
.
.

如有任何帮助,我们将不胜感激!

最佳答案

我认为没有简单的内置方法可以做到这一点,但是您可以使用 for 循环和 df[column].unique() 轻松完成此操作 它看起来像这样:

# Save columns to a list
col_list = df.columns.values.tolist()
new_list = []
for state in df['state'].unique():
    for date in df['date'].unique():
        temp = df[(df['state'] == state) & (df['date'] == date)]
        new_list.append([date, state, ' ', temp['sales'].sum(), 
        'nan', 'nan', 'nan', 'nan', 'nan', 'nan'])
        # Make sure you add other columns in new_list.append() so that when you append 
        # the new data to the original dataframe so that you can append the new data 
        # to the original dataframe without error. The ... in the new_list.append()
        # represents additional columns in your original dataframe.

df2 = pd.Dataframe(new_list, columns=col_list)
df = df.append(df2)

如果数据框中的其他列是标签列,或者您不会用于计算单个输出的列,则您将需要执行类似于对状态和日期列执行的操作,以确保当您将其附加到 for 循环中的列表中,而不是附加系列。如果您显示所有列,这将会有所帮助,因为尚不清楚上述代码是否会准确地导致您想要完成的任务,而不知道您想要对其他列执行什么操作。您可能需要在 for 循环中使用 zip(df['state'].unique(), df['other_col'].unique()) 以确保其他列已正确处理。希望我的回答对您有所帮助。如果我知道您想对其他专栏做什么,我可以更准确、更清晰地回答,并帮助您准确完成您想要完成的任务。

此外,您是否需要在同一数据框中包含结果(每个州的县数据总和)?如果不这样做,您可以简单地忽略上面代码中的最后一行。

如果您将多次执行此操作,则将其转换为可重用的函数可能是有意义的:

def sum_county_data(data, state_col, date_col, sum_cols):
    new_list = []
    for state in df[state_col].unique():
        for date in df[date_col].unique():
            temp = df[(df[state_col] == state) & (df[date_col] == date)]
            new_list.append([date, state, ' ', temp[sum_cols[0].sum(),
            'nan', 'nan', 'nan', 'nan', 'nan', 'nan'])
    df2 = pd.Dataframe(new_list, columns=df.columns.values.tolist())
    return df2

sum_df = sum_county_data(df, 'state', 'date', ['sales'])
df = df.append(sum_df)

当您使用 df.append() 时,您必须确保列精确匹配。您可以将 ignore_index=True 添加到 df.append() 以确保不会因重复索引值而导致错误。

关于python - 根据条件创建求和行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62328688/

相关文章:

python - Python获取语音转文本语音音频数据

python - 将张量的值传递给二维张量的下三角部分

python - django.core.exceptions.SuspiciousFileOperation : The joined path is located outside of the base path component

python - 是否有可能在 python 中实现一个巨大的查找表(1 亿多个键)?

python - 将一级混合头数据帧转换为 Pandas 中的垂直数据帧

python - 数据框中每组的 Pandas 第二最大值

python - 如何使用相同的索引分割 pandas 数据框

python - 如何优雅地发出自定义断言错误?

python - OHLC 采样正在创建错误的时间戳蜡烛

python - Pandas - 从 Excel 中读取表格