我有两个 Dataframe :
模式2:
Mode month1 month2 month3 month4 month5 month6 month7 month8 month9 month10 month11 month12
0 100 0 0 0 0 0 0 0 0 0 0 0 0
2 602 0 2 1 0 2 1 0 2 1 0 2 1
3 603 1 0 2 1 0 2 1 0 2 1 0 2
11 802 0 11 10 9 8 7 6 5 4 3 2 1
df_ia:
RevalMonth_plus Mode
0 1 602
35 1 100
52 4 100
79 1 802
94 4 603
95 4 603
96 4 603
98 1 100
逻辑是将df_ia的每一行与modal2的每一行进行比较,如果df_ia的行与modal2的行具有相同的模式编号,则将modal2的month1列添加到df_ia。
我可以通过以下代码成功完成此部分:
for index, row in modal2.iterrows():
conditions.append(df_ia['Mode'] == row['Mode'])
for col in ['month1']: #for loop list is because sometime need more than 1 column
col_v = modal2[col]
df_ia[col] = np.select(conditions, col_v, default=None)
输出为:
RevalMonth_plus Mode month1
0 1 602 0
35 1 100 0
52 4 100 0
79 1 802 0
94 4 603 1
95 4 603 1
96 4 603 1
98 1 100 0
但挑战在于:
如何将df_ia中的“month1”替换为相应的“revalmonth_plus”,如下所示:
for col in [f'month{df_ia['RevalMonth_plus']}']: #for loop list is because sometime need more than 1 column
col_v = modal2[col]
df_ia[col] = np.select(conditions, col_v, default=None)
理想的输出应该是:
RevalMonth_plus Mode dynamic_moth_value
0 1 602 0 #month1
35 1 100 0 #month1
52 4 100 0 #month4
79 1 802 0 #month1
94 4 603 1 #month4
95 4 603 1 #month4
96 4 603 1 #month4
98 1 100 0 #month1
我花了一整天的时间在这上面,但还是做不到。
3条答案
按热度按时间vzgqcmou1#
另一个解决方案:
印刷品:
ccrfmcuu2#
试一试
pd.wide_to_long
要重塑 Dataframe ,请执行以下操作:modal2
那么merge
left
维持秩序df_ia
:RevalMonth_plus Mode dynamic_month_value
0 1 602 0
1 1 100 0
2 4 100 0
3 1 802 0
4 4 603 1
5 4 603 1
6 4 603 1
7 1 100 0
modal2 = pd.DataFrame({
'Mode': [100, 602, 603, 802],
'month1': [1, 2, 3, 4],
'month4': [5, 6, 7, 8]
})
df_ia = pd.DataFrame({
'RevalMonth_plus': [1, 1, 4, 1, 4, 4, 4, 1],
'Mode': [602, 100, 100, 802, 603, 603, 603, 100]
})
```
modal2
:RevalMonth_plus Mode
0 1 602
1 1 100
2 4 100
3 1 802
4 4 603
5 4 603
6 4 603
7 1 100
```
new_df
:所有月份列都可以Map为
merge
第一:jyztefdp3#
对 Dataframe 行进行迭代几乎总是错误的。您需要合并 Dataframe :