我有一个大型数据框,其中包含美国各州和县的日期和数字。我想要做的是创建一个新行 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 state
求 sales
的总和为此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/