【问题标题】:How to convert a series of tuples into a pandas dataframe?如何将一系列元组转换为熊猫数据框?
【发布时间】:2019-04-23 11:06:26
【问题描述】:

假设我们有以下 pandas 系列是由 groupby 之后应用于数据帧的 apply 函数产生的。

<class 'pandas.core.series.Series'>
0        (1, 0, [0.2, 0.2, 0.2], [0.2, 0.2, 0.2])
1     (2, 1000, [0.6, 0.7, 0.5], [0.1, 0.3, 0.1])
2        (1, 0, [0.4, 0.4, 0.4], [0.4, 0.4, 0.4])
3        (1, 0, [0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
4    (3, 14000, [0.8, 0.8, 0.8], [0.6, 0.6, 0.6])
dtype: object

当给定 sigList=['sig1','sig2', 'sig3'] 时,我们可以将其转换为数据帧吗?

Length Distance sig1Max sig2Max sig3Max sig1Min sig2Min sig3Min
1 0 0.2 0.2 0.2 0.2 0.2 0.2                  
2 1000 0.6 0.7 0.5 0.1 0.3 0.1
1 0 0.4 0.4 0.4 0.4 0.4 0.4
1 0 0.5 0.5 0.5 0.5 0.5 0.5
3 14000 0.8 0.8 0.8 0.6 0.6 0.6

提前致谢

【问题讨论】:

  • def myfunc(x,signatures): return x.shape[0], x['start'].iloc[-1] - x['start'].iloc[0], x[signatures].agg(max), x[signatures].agg(min) 这个函数在元组中创建列表。我们可以在 return 语句中展平列表吗?

标签: python pandas dataframe series


【解决方案1】:

使用列表推导以老式(且快速)的方式进行:

columns = ("Length Distance sig1Max sig2Max" 
           "sig3Max sig1Min sig2Min sig3Min").split()
df = pd.DataFrame([[a, b, *c, *d] for a,b,c,d in series.values], columns=columns)
print(df)
   Length  Distance  sig1Max  sig2Max  sig3Max  sig1Min  sig2Min  sig3Min
0       1         0      0.2      0.2      0.2      0.2      0.2      0.2
1       2      1000      0.6      0.7      0.5      0.1      0.3      0.1
2       1         0      0.4      0.4      0.4      0.4      0.4      0.4
3       1         0      0.5      0.5      0.5      0.5      0.5      0.5
4       3     14000      0.8      0.8      0.8      0.6      0.6      0.6

或者,也许你的意思是,更动态地做一点

sigList = ['sig1', 'sig2', 'sig3']

columns = ['Length', 'Distance']
columns.extend(f'{s}{lbl}' for lbl in ('Max', 'Min') for s in sigList )

df = pd.DataFrame([[a,b,*c,*d] for a,b,c,d in series.values], columns=columns)
print(df)
   Length  Distance  sig1Max  sig2Max  sig3Max  sig1Min  sig2Min  sig3Min
0       1         0      0.2      0.2      0.2      0.2      0.2      0.2
1       2      1000      0.6      0.7      0.5      0.1      0.3      0.1
2       1         0      0.4      0.4      0.4      0.4      0.4      0.4
3       1         0      0.5      0.5      0.5      0.5      0.5      0.5
4       3     14000      0.8      0.8      0.8      0.6      0.6      0.6

【讨论】:

  • 太好了,尤其是动态的,因为在我的例子中 sigList 是在运行时解析的。
  • @burcak 我将循环的顺序与第二个交换了(对不起!)但你明白了。
  • 谢谢。实际上,下面的函数在分组数据帧的 apply 方法中调用时会生成一系列元组。有没有办法只返回数据框,这样我以后就不需要从系列中创建数据框了? def myfunc(x,signatures): return x.shape[0], x['start'].iloc[-1] - x['start'].iloc[0], x[signatures].agg(max) , x[签名].agg(min)
【解决方案2】:

你可以检查

newdf=pd.DataFrame(s.tolist())
newdf=pd.concat([newdf[[0,1]],pd.DataFrame(newdf[2].tolist()),pd.DataFrame(newdf[3].tolist())],1)
newdf.columns = [
    "Length", "Distance", "sig1Max", "sig2Max", "sig3Max", "sig1Min", "sig2Min", "sig3Min"
]
newdf
Out[163]: 
   Length  Distance  sig1Max   ...     sig1Min  sig2Min  sig3Min
0       1         0      0.2   ...         0.2      0.2      0.2
1       2      1000      0.6   ...         0.1      0.3      0.1
2       1         0      0.4   ...         0.4      0.4      0.4
3       1         0      0.5   ...         0.5      0.5      0.5
4       3     14000      0.8   ...         0.6      0.6      0.6
[5 rows x 8 columns]

【讨论】:

    【解决方案3】:

    您可以展平每个元素,然后将每个元素转换为一个系列本身。将每个元素转换为 Series 会将主 Series(下例中的 s)转换为 DataFrame。然后根据需要设置列名。

    例如:

    import pandas as pd
    
    # load in your data
    s = pd.Series([
        (1, 0, [0.2, 0.2, 0.2], [0.2, 0.2, 0.2]),
        (2, 1000, [0.6, 0.7, 0.5], [0.1, 0.3, 0.1]),
        (1, 0, [0.4, 0.4, 0.4], [0.4, 0.4, 0.4]),
        (1, 0, [0.5, 0.5, 0.5], [0.5, 0.5, 0.5]),
        (3, 14000, [0.8, 0.8, 0.8], [0.6, 0.6, 0.6]),
    ])
    
    def flatten(x):
        # note this is not very robust, but works for this case
        return [x[0], x[1], *x[2], *x[3]]
    
    df = s.apply(flatten).apply(pd.Series)
    df.columns = [
        "Length", "Distance", "sig1Max", "sig2Max", "sig3Max", "sig1Min", "sig2Min", "sig3Min"
    ]
    

    那么你有df

       Length  Distance  sig1Max  sig2Max  sig3Max  sig1Min  sig2Min  sig3Min
    0     1.0       0.0      0.2      0.2      0.2      0.2      0.2      0.2
    1     2.0    1000.0      0.6      0.7      0.5      0.1      0.3      0.1
    2     1.0       0.0      0.4      0.4      0.4      0.4      0.4      0.4
    3     1.0       0.0      0.5      0.5      0.5      0.5      0.5      0.5
    4     3.0   14000.0      0.8      0.8      0.8      0.6      0.6      0.6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 2016-01-19
      • 2020-09-10
      • 2021-08-18
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多