如何将可变长度列表从一个 python 数据框列转换为行?

我正在尝试将列表从一个数据框列转换为行,但不确定如何在 python 中有效地做到这一点? 我的实际数据有数千行和可变长度列表(在 Specs 列中,但为了简化起见,我将使用下面的示例。

import pandas as pd
data = [{'Type': 'A','Specs': [['a1',50],['a2',14]]},{'Type': 'B','Specs': [['b1',20],['b2',25],['b3',15],['b4',10]]},{'Type': 'C','Specs': [['c1',32]]} ]
df = pd.DataFrame(data)

最终的结果应该等同于下面数据帧的输出

data_out= [{'Type': 'A','model':'a1','qty': 50},{'Type': 'A','model':'a2','qty': 14},'model':'b1','qty': 20},'model':'b2','qty': 25},'model':'b3','qty': 15},'model':'b4','qty': 10},'model':'c1','qty': 32}]
df_out = pd.DataFrame(data_out)

我尝试将 apply 与一个函数一起使用,将每一行列表/值转换为数据帧,并且对如何为每一行返回一个数据帧并使用新行扩展新数据帧感到困惑。如果我走错了路,请告诉我,在大数据上获得所需数据帧输出的最有效方法是什么?谢谢

def convert_list(my_list):
   my_df = pd.DataFrame(pv_list,columns=['model','qty'])
return my_df

df[['model','qty']] = df['Specs'].apply(convert_list)
yzhwyf 回答:如何将可变长度列表从一个 python 数据框列转换为行?

您可以使用explode()+join()+DataFrame()+pop()

df=df.explode('Specs',ignore_index=True)
df[['Model','Qty']]=pd.DataFrame(df.pop('Specs').tolist())
#OR
#df=df.join(pd.DataFrame(df.pop('Specs').tolist(),columns=['Model','Qty']))

explode()+drop()+.str 访问器:

df=df.explode('Specs',ignore_index=True)
df['Model']=df['Specs'].str[0]
df['Qty']=df['Specs'].str[1]
df=df.drop('Specs',1)

explode()+pop()+agg()

df=df.explode('Specs','Qty']]=df.pop('Specs').agg(pd.Series)

df 的输出:

   Type     Model   Qty
0   A       a1      50
1   A       a2      14
2   B       b1      20
3   B       b2      25
4   B       b3      15
5   B       b4      10
6   C       c1      32
,

您不必编写任何自定义函数或加入/合并,使用 explode

文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.explode.html

import pandas as pd
data = [{'Type': 'A','Specs': [['a1',50],['a2',14]]},{'Type': 'B','Specs': [['b1',20],['b2',25],['b3',15],['b4',10]]},{'Type': 'C','Specs': [['c1',32]]} ]
df = pd.DataFrame(data)
# Code Example
df=df.explode('Specs').reset_index(drop=True)
df[['model','qty']] =  pd.DataFrame(df["Specs"].to_list())
df.drop('Specs',axis=1,inplace=True)
df
|    | Type   | model   |   qty |
|---:|:-------|:--------|------:|
|  0 | A      | a1      |    50 |
|  1 | A      | a2      |    14 |
|  2 | B      | b1      |    20 |
|  3 | B      | b2      |    25 |
|  4 | B      | b3      |    15 |
|  5 | B      | b4      |    10 |
|  6 | C      | c1      |    32 |

附注: 就是这样,如果它仍然很慢,我建议查看并行化的东西!

,

在你的情况下尝试

s = df.pop('Specs').explode()
pd.DataFrame(s.tolist(),'Qty'],index=s.index).join(df)
Out[84]: 
  Model  Qty Type
0    a1   50    A
0    a2   14    A
1    b1   20    B
1    b2   25    B
1    b3   15    B
1    b4   10    B
2    c1   32    C
本文链接:https://www.f2er.com/1762.html

大家都在问