Pandas:将 DataFrame 解压为 Series 会导致 NaN

我有以下数据框并想将它拆开,生成一个系列x和一个系列y,time作为索引和value数据:


   var  time  value

0    x     0     11

1    y     0    123

2    x     1     12

3    y     1    124

4    x     2     13

5    y     2    125

这是我的代码:


import pandas as pd


df = pd.DataFrame({

        'time': [0,0,1,1,2,2],

        'var': list('xyxyxy'),

        'value': [11,123,12,124,13,125]})


for col in ['x', 'y']:

    s = pd.Series(

            data=df.loc[df['var'] == col, 'value'],

            index=df.loc[df['var'] == col, 'time'],

            name=col)

    print(s)

这是输出:


time

0    11.0

1     NaN

2    12.0

Name: x, dtype: float64


time

0      NaN

1    123.0

2      NaN

Name: y, dtype: float64

但我希望这个系列是


time

0    11.0

1    12.0 

2    13.0

Name: x, dtype: float64


time

0    123.0

1    124.0

2    125.0

Name: y, dtype: float64

显然熊猫没有将time-axis 正确对齐到value-axis。根据我的理解,每个.loc应该只返回相应的 3 个元素并将它们组合在一起作为新构建的系列的索引和数据。

  1. 为什么这不发生?

  2. 获得我想要的结果的最简单方法是什么?


慕虎7371278
浏览 241回答 3
3回答

四季花海

有更好的方法来实现这一点。如果你想知道你的代码有什么问题,你将一个系列作为数据和索引传递,而是传递一个数组。for v in df['var'].unique():    s = pd.Series(        data=df.loc[df['var'] == v, 'value'].values,        index=df.loc[df['var'] == v, 'time'].values,        name=col)    print(s)0    111    122    13Name: y, dtype: int640    1231    1242    125Name: y, dtype: int64

繁星coding

这是pivot问题s=df.pivot(*df.columns)sOut[56]: time    0    1    2var                x      11   12   13y     123  124  125#s['y'],s['x']

烙印99

我不知道为什么把一个系列作为你的数据会给你这个结果,但我可以回答你的第二个问题获得我想要的结果的最简单方法是什么?您可以将数据转换为列表以获得所需的结果。for col in ['x', 'y']:    s = pd.Series(            data=df.loc[df['var'] == col, 'value'].tolist(),            index=df.loc[df['var'] == col, 'time'],            name=col)    print(s)输出:time0    111    122    13Name: x, dtype: int64time0    1231    1242    125Name: y, dtype: int64这是类似于@Wen 提交的答案的另一种方式(更优雅):df_new = pd.pivot_table(data=df, columns='var', index='time', values='value')输出:var    x    ytime         0     11  1231     12  1242     13  125然后你可以打电话df_new['x']或df_new['y']。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python