将列表分离到一个新的数据框中

Separating lists into a new dataframe

我有一个数据框,其中一列包含列表列表。所有基本列表都包含两个字符串。包含这些基本列表的列表中的列表数量是可变的。 示例:

            A
    0 [[1,1],[1,1]]
    1 [[1,1]]
    2 [[1,1],[1,1],[1,1]]

我想要一个有两列的新数据框。第一列有每个基本列表中的第一项,第二列有第二项。我是这样解决的:

df = pd.DataFrame(data = {'A': [[[1,1],[1,1]], [[1,1]], [[1,1],[1,1],[1,1]]]})

df2 = pd.DataFrame(columns = ['A', 'B'])
for x in df.A:
    for i in x:
        n = pd.DataFrame([i], columns = ('A', 'B'))
        df2 = df2.append(n)
   A  B
0  1  1
0  1  1
0  1  1
0  1  1
0  1  1
0  1  1 

我知道遍历数据帧不好,但我不知道该怎么做。以下是一些失败的尝试:

for x in df1:
     df2 = [df2.append(pd.DataFrame([i], columns = ('A', 'B'))) for i in x]

df2 = df1.apply(lambda x: df2.append(pd.DataFrame([x[0]], columns = ['name', 'tid'])))

如果第一个列表推导式起作用,我会尝试将 for 循环移动到第一个列表推导式的末尾。

提前感谢您的帮助!

这样做有用吗?

import pandas as pd
import itertools

df = pd.DataFrame(data = {'A': [[[1,1],[1,1]], [[1,1]], [[1,1],[1,1],[1,1]]]})

a = []
b = []
for k in range(len(df)):
    a.append([x[0] for x in df.iloc[k].A])
    b.append([x[1] for x in df.iloc[k].A])

df2 = df2 = pd.DataFrame(data = {'A': list(itertools.chain(*a)), 'B': list(itertools.chain(*b))})

结果:

>>> df2
   A  B
0  1  1
1  1  1
2  1  1
3  1  1
4  1  1
5  1  1

快速解决方案:

obj = df['A'].explode()
df1 = pd.DataFrame(obj.tolist(), index=obj.index, columns=['A', 'B'])

演示数据:

df = pd.Series([
    [[1,2],[1,2]],[[3,4]], [[1,2],[1,3],[1,4]]
], name='A').to_frame()
print(df)
                          A
0          [[1, 2], [1, 2]]
1                  [[3, 4]]
2  [[1, 2], [1, 3], [1, 4]]

使用 explode 将类似列表的每个元素转换为一行,复制索引值。

obj = df['A'].explode()
df1 = pd.DataFrame(obj.tolist(), index=obj.index, columns=['A', 'B'])
df_result = df1.groupby(level=0)[['A', 'B']].agg(list)
df_result

               A          B
    0     [1, 1]     [2, 2]
    1        [3]        [4]
    2  [1, 1, 1]  [2, 3, 4]

df1

       A  B
    0  1  2
    0  1  2
    1  3  4
    2  1  2
    2  1  3
    2  1  4

使用 .apply(pd.Series) 将具有列表元素的列转换为数据框。

df2 = df.A.apply(pd.Series)
print(df2)

       0       1       2
0  [1, 2]  [1, 2]     NaN
1  [3, 4]     NaN     NaN
2  [1, 2]  [1, 3]  [1, 4]