熊猫:将DataFrame堆积为Series会导致NaN

时间:2018-10-30 17:39:10

标签: python pandas

我有以下数据框,并希望将其拆开,以x作为索引,以y作为数据,生成一系列time和一系列value:< / p>

   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轴与value轴正确对齐。据我了解,每个.loc应该只返回相应的3个元素,并将它们组装为新构建的序列的索引和数据。

  1. 为什么不发生这种情况?
  2. 获得所需结果的最简单方法是什么?

3 个答案:

答案 0 :(得分:2)

这是pivot问题

s=df.pivot(*df.columns)
s
Out[56]: 
time    0    1    2
var                
x      11   12   13
y     123  124  125

#s['y'],s['x']

答案 1 :(得分:1)

@Wen指出,有更好的方法可以实现这一目标。如果您想知道代码有什么问题,可以将一系列作为数据和索引传递,而应传递一个数组。

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    11
1    12
2    13
Name: y, dtype: int64
0    123
1    124
2    125
Name: y, dtype: int64

答案 2 :(得分:0)

我不确定为什么将系列作为您的数据能给您带来结果,但是我可以回答您的第二个问题

  1. 获得所需结果的最简单方法是什么?

您可以将数据转换为列表,以获得所需的结果。

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)

输出:

time
0    11
1    12
2    13
Name: x, dtype: int64
time
0    123
1    124
2    125
Name: y, dtype: int64

这是与@Wen提交的答案类似的另一种方式(并且更优雅):

df_new = pd.pivot_table(data=df, columns='var', index='time', values='value')

输出:

var    x    y
time         
0     11  123
1     12  124
2     13  125

然后您可以呼叫df_new['x']df_new['y']