根据条件创建汇总行

时间:2020-06-11 16:11:01

标签: 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的{​​{1}}创建一个新行,以对该each state的{​​{1}}求和。所有其他列可以为空。各州的汇总行不应有任何县,这样就可以表明其州级别。

结果数据框:

sales

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

我认为没有简单的内置方法可以执行此操作,但是您可以使用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)

如果数据框中的其他列是标签列,或将不用于计算奇异输出的列,则需要执行与对state和date列进行的操作类似的操作,以确保将其添加到for循环中的列表中,而不添加序列。如果显示所有列,这将有所帮助,因为不清楚上面的代码是否会准确地导致您要完成的工作,而又不知道要对其他列做些什么。您可能需要在zip(df['state'].unique(), df['other_col'].unique())循环中使用for,以确保其他列得到正确处理。希望我的回答对您有所帮助。如果我知道您想对其他专栏做些什么,那么我可以更准确,更明确地回答您,并帮助您准确地完成您想完成的工作。

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

如果您要执行的操作不止一次,可以将其转换为可重用的函数:

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()中,以确保没有错误,因为索引值重复。