我有一个数据框架:
data = {'id': [1, 2, 3, 4, 5, 6, 7, 8],
'stat': ['ordered', 'unconfirmed', 'ordered', 'unknwon', 'ordered', 'unconfirmed', 'ordered', 'back'],
'date': ['2021', '2022', '2023', '2024', '2025','2026','2021', '1990']
}
df_data = pd.DataFrame(data)
df_data我对数据框架做了如下更改:
l = [1, 2, 1, 3, 1, 0, 0, 0]
df_d = df_data.join(pd.get_dummies(df_data.date).cumsum(axis=1).mul(lis, axis=0
).astype(int))
df_d我想循环遍历特定的列,并在其中添加一些值,如下所示:
ln = len(df_d.columns)
for i, k in enumerate(df_d.stat):
if k == 'ordered':
for column in df_d .columns[-(ln-3):]:
if df_d.loc[i].at[column] == 1:
if df_d.columns.get_loc(column) + 3 <= ln:
df_d.iloc[i,[df_d.columns.get_loc(column)+2]] = [100]
df_d结果如下(但尚未完成):
id stat date 1990 2021 2022 2023 2024 2025 2026 2027
0 1 ordered 2021 0 1 1 100 100 1 1 100
1 2 unconfirmed 2022 0 0 2 2 2 2 2 2
2 3 ordered 2023 0 0 0 1 1 100 100 1
3 4 unknwon 2024 0 0 0 0 3 3 3 3
4 5 ordered 2025 0 0 0 0 0 1 1 100
5 6 unconfirmed 2026 0 0 0 0 0 0 0 0
6 7 ordered 2021 0 1 1 1 1 1 1 1
7 8 back 1990 0 0 0 0 0 0 0 0 我希望更改所有已经“订购”了stat和循环的列的行,跳过前两个值,并将该行中的所有其他值设置为100。但是我不知道如何避免跳过这一步,因为它允许后面的一些列不做任何更改。完成此操作后,我希望在不同的步骤中将最后2列的所有值设置为1。任何关于修复这个循环问题的想法都会非常感谢。
预期产出:
id stat date 1990 2021 2022 2023 2024 2025 2026 2027
0 1 ordered 2021 0 1 1 100 100 100 100 100
1 2 unconfirmed 2022 0 0 2 2 2 2 2 2
2 3 ordered 2023 0 0 0 1 1 100 100 100
3 4 unknwon 2024 0 0 0 0 3 3 3 3
4 5 ordered 2025 0 0 0 0 0 1 1 100
5 6 unconfirmed 2026 0 0 0 0 0 0 0 0
6 7 ordered 2021 0 1 1 100 100 100 100 100
7 8 back 1990 0 0 0 0 0 0 0 0 发布于 2022-04-20 11:41:13
在加入之前,您可以使用numpy和numpy.triu计算2D掩码,并使用它设置100个值:
df2 = pd.get_dummies(df_data.date).cumsum(axis=1).mul(lis, axis=0).astype(int)
skip = 2 # number of columns to skip
# mask for upper triangle (above +2 diagonal)
m1 = np.triu(np.full(df2.shape, True), k=skip+1)
# mask for rows corresponding to ordered
m2 = df_data[['stat']].eq('ordered').to_numpy()
df2[m1&m2] = 100 # the two masks are combined by broadcasting
df_d = df_data.join(df2)产出:
id stat date 1990 2021 2022 2023 2024 2025 2026 2027
0 1 ordered 2021 0 1 1 100 100 100 100 100
1 2 unconfirmed 2022 0 0 2 2 2 2 2 2
2 3 ordered 2023 0 0 0 1 1 100 100 100
3 4 unknwon 2024 0 0 0 0 3 3 3 3
4 5 ordered 2025 0 0 0 0 0 1 1 100
5 6 unconfirmed 2026 0 0 0 0 0 0 0 0
6 7 ordered 2027 0 0 0 0 0 0 0 0
7 8 back 1990 0 0 0 0 0 0 0 0https://stackoverflow.com/questions/71938429
复制相似问题