我有两个索引长度不同的数据帧,如下所示:
df_1:
State Month Total Time ... N columns
AL 4 1000
AL 5 500
.
.
.
VA 11 750
VA 12 1500
df_2:
State Month ... N columns
AL 4
AL 5
.
.
.
VA 11
VA 12
如果状态和月份值在数据帧之间相同,我想向df_2添加一个Total time列,该列使用df_1的Total Time列中的值。最终,我将得到:
df_2:
State Month Total Time ... N columns
AL 4 1000
AL 5 500
.
.
.
VA 11 750
VA 12 1500
我希望有条件地执行此操作,因为索引长度不同。到目前为止,我已经尝试过:
def f(row):
if (row['State'] == row['State']) & (row['Month'] == row['Month']):
val = x for x in df_1["Total Time"]
return val
df_2['Total Time'] = df_2.apply(f, axis=1)
这不起作用。您将使用哪种方法来完成此任务? 任何帮助表示赞赏!
答案 0 :(得分:1)
您可以这样做:
考虑我的示例数据框:
In [2327]: df_1
Out[2327]:
State Month Total Time
0 AL 2 1000
1 AB 4 500
2 BC 1 600
In [2328]: df_2
Out[2328]:
State Month
0 AL 2
1 AB 5
In [2329]: df_2 = pd.merge(df_2, df_1, on=['State', 'Month'], how='left')
In [2330]: df_2
Out[2330]:
State Month Total Time
0 AL 2 1000.0
1 AB 5 NaN
答案 1 :(得分:0)
如其他评论所述,pd.merge()是连接两个数据框并提取列的方式。问题在于,仅将“状态”和“月”合并将导致每个排列成为新列(df_1中的所有Al-4将与df_2中的所有其他AL-4合并)。
以您的示例为例,
df_1
State Month Total Time df_1 col...
0 AL 4 1000 6
1 AL 4 500 7
2 VA 12 750 8
3 VA 12 1500 9
df_2
State Month df_2 col...
0 AL 4 1
1 AL 4 2
2 VA 12 3
3 VA 12 4
df_1_cols_to_use = ['State', 'Month', 'Total Time']
# note the selection of the column to use from df_1. We only want the column
# we're merging on, plus the column(s) we want to bring in, in this case 'Total Time'
new_df = pd.merge(df_2, df_1[df_1_cols_to_use], on=['State', 'Month'], how='left')
new_df:
State Month df_2 col... Total Time
0 AL 4 1 1000
1 AL 4 1 500
2 AL 4 2 1000
3 AL 4 2 500
4 VA 12 3 750
5 VA 12 3 1500
6 VA 12 4 750
7 VA 12 4 1500
您提到它们的索引长度不同。根据问题的参数,无法确定Total Time的哪个值将与df_2中的一行匹配。如果df_2中有3个AL-4条目,它们分别得到1000、500或某种组合吗?该信息将是必需的。没有这个,这将是获得所有可能性的最佳猜测。