用熊猫融化

哈维尔

问题

我是Python的新手,正在尝试将表转换为所需的输出。

可复制的数据

我有这张桌子,我正在尝试将其转换为预期的输出。

pd.DataFrame({'A': ['1.Food', '1.1Bread', '1.2Chicken', 'Car', 'Animal', 'Ball'], 'Val1': [10, 14, 94, 13, 49, 89], 'Val2': [1,2,3,4,5,6], 'Val3' : [100, 120, 130, 140, 150, 160]}, 
                  columns=['A', 'Val1', 'Val2', 'Val3'])


    A         Val1 Val2 Val3
0   1.Food      10  1   100
1   1.1Bread    14  2   120
2   1.2Chicken  94  3   130
3   Car         13  4   140
4   Animal      49  5   150
5   Ball        89  6   160

预期产量

输出量

有人可以跟我分享如何正确地进行调整吗?谢谢!

更新资料

我使用过melt,它以某种方式创建了我想要的东西,但是我仍然无法获得我的子类别。

t1.melt(id_vars = ['A'])




      A     variable    value
0   1.Food  Val1         10
1   1.1Bread    Val1    14
2   1.2Chicken  Val1    94
3   Car     Val1        13
4   Animal  Val1        49
5   Ball    Val1        89
6   1.Food  Val2        1
7   1.1Bread    Val2    2
8   1.2Chicken  Val2    3
9   Car     Val2        4
10  Animal  Val2        5
11  Ball    Val2        6
12  1.Food  Val3        100
13  1.1Bread    Val3    120
14  1.2Chicken  Val3    130
15  Car     Val3        140
16  Animal  Val3        150
17  Ball    Val3        160
Serge Ballesta

我找不到真正直接的方法,所以我一步一步地做到了:

  • 从A列中一个点之前的数字识别数字类别
  • 当列A包含2个以点分隔的数字时,提取一个子类别
  • 建立类别栏
    • 如果SubCategory是NaN,请使用A列
    • 使用带有数字类别的groupby来填充“类别”列

完成后,简单stack给出结果。代码可以是:

df = pd.DataFrame({'A': ['1.Food', '1.1Bread', '1.2Chicken', 'Car', 'Animal', 'Ball'], 'Val1': [10, 14, 94, 13, 49, 89], 'Val2': [1,2,3,4,5,6], 'Val3' : [100, 120, 130, 140, 150, 160]},
                  columns=['A', 'Val1', 'Val2', 'Val3'])

df['Categ'] = df['A'].str.extract(r'^(\d+)\.')
df['SubCategory'] = df['A'].str.extract(r'^(\d+\.\d+.*)')
df.loc[df['SubCategory'].isna(),'Category'] = df.loc[
    df['SubCategory'].isna(),'A']

df.loc[~ df['Categ'].isna(), 'Category'] = df[~ df['Categ'].isna()].groupby(
    'Categ')['Category'].apply(lambda x: x.bfill().ffill())

resul = df.set_index(['Category','SubCategory'])[
    ['Val1', 'Val2', 'Val3']].stack().reset_index().rename(
        columns={'level_2': 'ValueType', 0: 'Value'})

它给出了预期的结果:

   Category SubCategory ValueType  Value
0    1.Food         NaN      Val1     10
1    1.Food         NaN      Val2      1
2    1.Food         NaN      Val3    100
3    1.Food    1.1Bread      Val1     14
4    1.Food    1.1Bread      Val2      2
5    1.Food    1.1Bread      Val3    120
6    1.Food  1.2Chicken      Val1     94
7    1.Food  1.2Chicken      Val2      3
8    1.Food  1.2Chicken      Val3    130
9       Car         NaN      Val1     13
10      Car         NaN      Val2      4
11      Car         NaN      Val3    140
12   Animal         NaN      Val1     49
13   Animal         NaN      Val2      5
14   Animal         NaN      Val3    150
15     Ball         NaN      Val1     89
16     Ball         NaN      Val2      6
17     Ball         NaN      Val3    160

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章