如何将带有值列表的列转换为Pandas DataFrame

时间:2016-10-10 08:58:22

标签: python pandas dataframe

您好我有这样的数据框:

    A             B 
0:  some value    [[L1, L2]]

我想将其更改为:

    A             B 
0:  some value    L1
1:  some value    L2

我该怎么做?

6 个答案:

答案 0 :(得分:17)

你可以这样做:

In [84]: df
Out[84]:
               A               B
0     some value      [[L1, L2]]
1  another value  [[L3, L4, L5]]

In [85]: (df['B'].apply(lambda x: pd.Series(x[0]))
   ....:         .stack()
   ....:         .reset_index(level=1, drop=True)
   ....:         .to_frame('B')
   ....:         .join(df[['A']], how='left')
   ....: )
Out[85]:
    B              A
0  L1     some value
0  L2     some value
1  L3  another value
1  L4  another value
1  L5  another value

更新: a more generic solution

答案 1 :(得分:7)

使用chain.from_iterablenumpy.repeat加快解决方案:

"string1"
"string2"
"string3"

<强>计时

from itertools import chain
import numpy as np
import pandas as pd

df = pd.DataFrame({'A':['a','b'],
                   'B':[[['A1', 'A2']],[['A1', 'A2', 'A3']]]})

print (df)
   A               B
0  a      [[A1, A2]]
1  b  [[A1, A2, A3]]


df1 = pd.DataFrame({ "A": np.repeat(df.A.values, 
                                    [len(x) for x in (chain.from_iterable(df.B))]),
                     "B": list(chain.from_iterable(chain.from_iterable(df.B)))})

print (df1)
   A   B
0  a  A1
1  a  A2
2  b  A1
3  b  A2
4  b  A3

答案 2 :(得分:5)

熊猫> = 0.25

df1 = pd.DataFrame({'A':['a','b'],
               'B':[[['1', '2']],[['3', '4', '5']]]})
print(df1)

    A   B
0   a   [[1, 2]]
1   b   [[3, 4, 5]]

df1 = df1.explode('B')
df1.explode('B')

    A   B
0   a   1
0   a   2
1   b   3
1   b   4
1   b   5

我不知道这种方法有多好,但是当您有项目列表时,它会起作用。

答案 3 :(得分:3)

我无法找到一种优雅的方式来处理这个问题,但以下代码可以正常工作......

import pandas as pd
import numpy as np
df = pd.DataFrame([{"a":1,"b":[[1,2]]},{"a":4, "b":[[3,4,5]]}])
z = []
for k,row in df.iterrows():
    for j in list(np.array(row.b).flat):
        z.append({'a':row.a, 'b':j})
result = pd.DataFrame(z)

答案 4 :(得分:0)

我认为这是最快,最简单的方法:

not

答案 5 :(得分:0)

这是另一个选择

unpacked = (pd.melt(df.B.apply(pd.Series).reset_index(),id_vars='index')
 .merge(df, left_on = 'index', right_index = True))
unpacked = (unpacked.loc[unpacked.value.notnull(),:]
.drop(columns=['index','variable','B'])
.rename(columns={'value':'B'})
  1. 将pd.series应用于B列->将每个列表条目拆分到不同的行
  2. 将其融合,以便每个条目都是一个单独的行(保留索引)
  3. 将其合并回原始数据框
  4. 整理-删除不必要的列并重命名值列