gpt4 book ai didi

python - 如何根据列的唯一值将其他列的行转换为列?

转载 作者:行者123 更新时间:2023-12-04 15:03:40 24 4
gpt4 key购买 nike

假设我有一个结构如下的df,

column1 | column2 | column3 | column4 | column5 | column6 | column7
A | B | C | 10 | 78 | 12 | 202001
A | B | D | 21 | 64 | 87 | 202001
A | B | E | 21 | 64 | 87 | 202001
X | K | C | 54 | 23 | 23 | 202001
X | K | D | 21 | 55 | 87 | 202001
X | K | E | 21 | 43 | 22 | 202001
A | B | C | 10 | 78 | 12 | 202002
A | B | D | 23 | 64 | 87 | 202002
A | B | E | 21 | 11 | 34 | 202002
Z | K | C | 10 | 78 | 12 | 202002
Z | K | D | 21 | 13 | 56 | 202002
Z | K | E | 12 | 77 | 34 | 202002

column1 和 column2 之间的关系 - 一对多

column2 和 column1 之间的关系 - 一对多

预期输出:

column1 | column2 | column3 | column4_202001 | column5_202001 | column6_202001 | column4_202002 | column5_202002 | column6_202002 |
A | B | C | 10 | 78 | 12 | 10 | 78 | 12 |
A | B | D | 21 | 64 | 87 | 23 | 64 | 87 |
A | B | E | 21 | 64 | 87 | 21 | 11 | 34 |
X | K | C | 54 | 23 | 23 | 0 | 0 | 0 |
X | K | D | 21 | 55 | 87 | 0 | 0 | 0 |
X | K | E | 21 | 43 | 22 | 0 | 0 | 0 |
Z | K | C | 0 | 0 | 0 | 10 | 78 | 12 |
Z | K | D | 0 | 0 | 0 | 21 | 13 | 56 |
Z | K | E | 0 | 0 | 0 | 12 | 77 | 34 |

此外,在转换时,我可以为每个 column7 在 column6_yyyymm 旁边创建一个空列吗?

最终输出,

column1 | column2 | column3 | column4_202001 | column5_202001 | column6_202001 |   empty_202001 | column4_202002 | column5_202002 | column6_202002 | empty_202002 ....
A | B | C | 10 | 78 | 12 | | 10 | 78 | 12 |
A | B | D | 21 | 64 | 87 | | 23 | 64 | 87 |
A | B | E | 21 | 64 | 87 | | 21 | 11 | 34 |
X | K | C | 54 | 23 | 23 | | 0 | 0 | 0 |
X | K | D | 21 | 55 | 87 | | 0 | 0 | 0 |
X | K | E | 21 | 43 | 22 | | 0 | 0 | 0 |
Z | K | C | 0 | 0 | 0 | | 10 | 78 | 12 |
Z | K | D | 0 | 0 | 0 | | 21 | 13 | 56 |
Z | K | E | 0 | 0 | 0 | | 12 | 77 | 34 |

如何使用 python 函数和/或 pandas 库实现最终输出?如果有任何不清楚的地方,请告诉我。

更新:

对于所有 empty_yyyymm 列,我想实现以下功能,

        def get_final(row):
if row['column2'].isin(['H', 'S', 'Z']):
return 0
elif row['column4_yyyymm'] + row['column5_yyyymm'] - row['column6_yyyymm'] < 0 and not row['column2'].isin(['H', 'S', 'Z']):
return 0
else:
return row['column4_yyyymm'] + row['column5_yyyymm'] - row['column6_yyyymm']

如何也能做到这一点?

注意:yyyymm 是引用 column7 的通用方式。它实际上不是一个列。

最佳答案

首先通过 DataFrame.assign 创建空列, 然后通过 DataFrame.set_index reshape 与 DataFrame.unstack并按 DataFrame.sort_index 在第二级对日期时间进行排序:

df = (df.assign(empty = np.nan)
.set_index(['column1','column2','column3','column7'])
.unstack(fill_value=0)
.sort_index(level=1, axis=1))

然后为所有列设置缺失值,通过mapMultiIndex in columns展平,最后转换indexDataFrame.reset_index列:

df['empty'] = np.nan
#if need fill by empty string
#df['empty'] = ''
df.columns = df.columns.map(lambda x: f'{x[0]}_{x[1]}')
df = df.reset_index()
print (df)
column1 column2 column3 column4_202001 column5_202001 column6_202001 \
0 A B C 10 78 12
1 A B D 21 64 87
2 A B E 21 64 87
3 X K C 54 23 23
4 X K D 21 55 87
5 X K E 21 43 22
6 Z K C 0 0 0
7 Z K D 0 0 0
8 Z K E 0 0 0

empty_202001 column4_202002 column5_202002 column6_202002 empty_202002
0 NaN 10 78 12 NaN
1 NaN 23 64 87 NaN
2 NaN 21 11 34 NaN
3 NaN 0 0 0 NaN
4 NaN 0 0 0 NaN
5 NaN 0 0 0 NaN
6 NaN 10 78 12 NaN
7 NaN 21 13 56 NaN
8 NaN 12 77 34 NaN

编辑:首先按条件计算新列 empty ,然后在不设置 NaN 的情况下应用上面的解决方案,例如:

m1 = df['column2'].isin(['H', 'S', 'Z'])

s = df['column4'] + df['column5'] - df['column6']
m2 = (s < 0) & ~m1

out = np.where(m1 | m2, 0, s)
df = (df.assign(empty = out)
.set_index(['column1','column2','column3','column7'])
.unstack(fill_value=0)
.sort_index(level=1, axis=1))

df.columns = df.columns.map(lambda x: f'{x[0]}_{x[1]}')
df = df.reset_index()

print (df)
column1 column2 column3 column4_202001 column5_202001 column6_202001 \
0 A B C 10 78 12
1 A B D 21 64 87
2 A B E 21 64 87
3 X K C 54 23 23
4 X K D 21 55 87
5 X K E 21 43 22
6 Z K C 0 0 0
7 Z K D 0 0 0
8 Z K E 0 0 0

empty_202001 column4_202002 column5_202002 column6_202002 empty_202002
0 76 10 78 12 76
1 0 23 64 87 0
2 0 21 11 34 0
3 54 0 0 0 0
4 0 0 0 0 0
5 42 0 0 0 0
6 0 10 78 12 76
7 0 21 13 56 0
8 0 12 77 34 55

关于python - 如何根据列的唯一值将其他列的行转换为列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66545100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com