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

标签 python-3.x pandas dataframe

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

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/

相关文章:

python - 两个 Pandas 数据帧之间的多个条件总和

python - 按日期对行进行分组并覆盖 NaN 值

python - Pandas Dataframe 将数据拼接成 2 列,并用逗号和整数组成一个数字

python - Python 3.4 中的包装函数缺少必需的位置参数

python-3.x - 避免部分初始化的模块 ImportError

linux - 指向 python 模块以安装到指定的站 pip 包位置

python - 如何根据索引位置标准化 Pandas 数据框中的值?

python - 如何在散点图中解释相同的数据点?

python-3.x - Julia UndefVarError

python - 多索引的字典键字典