gpt4 book ai didi

python-3.x - 根据标志熔化数据框

转载 作者:行者123 更新时间:2023-12-02 02:27:17 25 4
gpt4 key购买 nike

我有一个像这样的数据框:

pd.DataFrame({'time':['01-01-2020','02-01-2020','01-01-2020','02-01-2020'],'level':['q','q','r','r'],'a':[1,2,3,4],'b':[12,34,54,67],'c':[18,29,39,47],'a_1':[0.1,0.2,0.3,0.4],'a_2':[0,1,0,1],'b_1':[0.28,0.47,0.02,0.05],'b_2':[1,1,0,1],'c_1':[0.18,0.40,0.12,0.01],'c_2':[1,1,0,0]})
>> time level a b c a_1 a_2 b_1 b_2 c_1 c_2
0 01-01-2020 q 1 12 18 0.1 0 0.28 1 0.18 1
1 02-01-2020 q 2 34 29 0.2 1 0.47 1 0.40 1
2 01-01-2020 r 3 54 39 0.3 0 0.02 0 0.12 0
3 02-01-2020 r 4 67 47 0.4 1 0.05 1 0.01 0

我希望以 timelevel 作为索引来融化数据,将所有其他列作为行,这些列的标志 1 与其前缀相对应。例如。如果值 a_2,我希望将 aa_1 的值列为 valuesitems 是 1。期望的输出:

>>   time   level column values items
0 01-01-2020 q b 12 0.28
1 01-01-2020 q c 18 0.18
2 02-01-2020 q a 2 0.20
3 02-01-2020 q b 34 0.47
4 02-01-2020 q c 29 0.40
5 02-01-2020 r a 4 0.40
6 02-01-2020 r b 67 0.05

无论标志如何,我都可以获得所有值,然后过滤flags==1。但是,不确定在这种情况下如何“融化”/“堆叠”。我尝试了很多方法但都没有成功。请在这里帮助我。

最佳答案

让我们尝试一下 melt :

i, c = ['time', 'level'], pd.Index(['a', 'b','c'])

# mask the values where flag=0
m = df[c + '_1'].mask(df[c + '_2'].eq(0).values)

# melt the dataframe & assign the items column
s = df[[*i, *c]].melt(i, var_name='columns')\
.assign(items=m.values.T.reshape((-1, 1)))

# drop the nan values and sort the dataframe
s = s.dropna(subset=['items']).sort_values(i, ignore_index=True)

详细信息:

屏蔽以后缀_1结尾的列中的值,其中相应标志列中的值等于0:

   a_1   b_1   c_1
0 NaN 0.28 0.18
1 0.2 0.47 0.40
2 NaN NaN NaN
3 0.4 0.05 NaN

融化包含列a、b、c的数据帧,然后 reshape 屏蔽值并分配新列items 在融化的数据框中:

          time level columns  value  items
0 01-01-2020 q a 1 NaN
1 02-01-2020 q a 2 0.20
2 01-01-2020 r a 3 NaN
3 02-01-2020 r a 4 0.40
4 01-01-2020 q b 12 0.28
5 02-01-2020 q b 34 0.47
6 01-01-2020 r b 54 NaN
7 02-01-2020 r b 67 0.05
8 01-01-2020 q c 18 0.18
9 02-01-2020 q c 29 0.40
10 01-01-2020 r c 39 NaN
11 02-01-2020 r c 47 NaN

最后删除 items 中的 NaN 值,并对 timelevelsort 值进行排序 获取最终结果:

         time level columns  value  items
0 01-01-2020 q b 12 0.28
1 01-01-2020 q c 18 0.18
2 02-01-2020 q a 2 0.20
3 02-01-2020 q b 34 0.47
4 02-01-2020 q c 29 0.40
5 02-01-2020 r a 4 0.40
6 02-01-2020 r b 67 0.05

关于python-3.x - 根据标志熔化数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65463249/

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