Python 从列中可用的列表数据展开行

Python 从列中可用的列表数据展开行,python,list,pandas,dataframe,expand,Python,List,Pandas,Dataframe,Expand,我在熊猫中有这样一个数据框: column1 column2 [a,b,c] 1 [d,e,f] 2 [g,h,i] 3 预期输出: 如何处理这些数据 您可以通过其构造函数创建数据帧,并且: 如果需要按子集[['column1','column2']]更改顺序,也可以省略第一个重置索引: df2 = pd.DataFrame(df.column1.tolist(), index=df.column2) .stack()

我在熊猫中有这样一个数据框:

 column1      column2
 [a,b,c]        1
 [d,e,f]        2
 [g,h,i]        3
预期输出:
如何处理这些数据

您可以通过其构造函数创建
数据帧
,并且:

如果需要按子集
[['column1','column2']]
更改顺序,也可以省略第一个
重置索引

df2 = pd.DataFrame(df.column1.tolist(), index=df.column2)
        .stack()
        .reset_index(name='column1')[['column1','column2']]
print (df2)
  column1  column2
0       a        1
1       b        1
2       c        1
3       d        2
4       e        2
5       f        2
6       g        3
7       h        3
8       i        3
df.explode('column1', ignore_index=True)
另一种解决方案是从第一列创建
数据帧
,然后通过原始
数据帧
创建
系列

df = pd.DataFrame({'column1': [['a','b','c'],['d','e','f'],['g','h','i']],
                   'column2':[1,2,3]})


a = pd.DataFrame.from_records(df.column1.tolist())
                .stack()
                .reset_index(level=1, drop=True)
                .rename('column1')

print (a)
0    a
0    b
0    c
1    d
1    e
1    f
2    g
2    h
2    i
Name: column1, dtype: object

print (df.drop('column1', axis=1)
         .join(a)
         .reset_index(drop=True)[['column1','column2']])

  column1  column2
0       a        1
1       b        1
2       c        1
3       d        2
4       e        2
5       f        2
6       g        3
7       h        3
8       i        3

另一种解决方案是使用0.23以来可用的函数的
result\u type='expand'
参数。回答这个问题的方法可以推广——见下文:

import pandas as pd
from numpy import arange

df = pd.DataFrame(
    {'column1' : [['a','b','c'],['d','e','f'],['g','h','i']],
    'column2': [1,2,3]}
)

pd.melt(
    df.join(
        df.apply(lambda row: row['column1'], axis=1, result_type='expand')
        ),
 value_vars=arange(df['column1'].shape[0]), value_name='column1', var_name='column2')[['column1','column2']]

# can be generalized 

df = pd.DataFrame(
    {'column1' : [['a','b','c'],['d','e','f'],['g','h','i']],
    'column2': [1,2,3],
    'column3': [[1,2],[2,3],[3,4]],
    'column4': [42,23,321],
    'column5': ['a','b','c']}
)

(pd.melt(
    df.join(
        df.apply(lambda row: row['column1'], axis=1, result_type='expand')
        ),
 value_vars=arange(df['column1'].shape[0]), value_name='column1', id_vars=df.columns[1:])
 .drop(columns=['variable'])[list(df.columns[:1]) + list(df.columns[1:])]
 .sort_values(by=['column1']))
更新(供Jwely评论): 如果列表长度不同,可以执行以下操作:

df = pd.DataFrame(
    {'column1' : [['a','b','c'],['d','f'],['g','h','i']],
    'column2': [1,2,3]}
)

longest = max(df['column1'].apply(lambda x: len(x)))

pd.melt(
    df.join(
        df.apply(lambda row: row['column1'] if len(row['column1']) >= longest else row['column1'] + [None] * (longest - len(row['column1'])), axis=1, result_type='expand')
    ),
 value_vars=arange(df['column1'].shape[0]), value_name='column1', var_name='column2').query("column1 == column1")[['column1','column2']]
DataFrame.explode
因为我们有这样的方法,它将每个元素的列表扩展为一行,并重复其余的列:

df.explode('column1').reset_index(drop=True)
输出


  column1  column2
0       a        1
1       b        1
2       c        1
3       d        2
4       e        2
5       f        2
6       g        3
7       h        3
8       i        3
  column1  column2
0       a        1
1       b        1
2       c        1
3       d        2
4       e        2
5       f        2
6       g        3
7       h        3
8       i        3

因为我们有
ignore\u index
参数,所以我们不必与
reset\u index
链接:

df2 = pd.DataFrame(df.column1.tolist(), index=df.column2)
        .stack()
        .reset_index(name='column1')[['column1','column2']]
print (df2)
  column1  column2
0       a        1
1       b        1
2       c        1
3       d        2
4       e        2
5       f        2
6       g        3
7       h        3
8       i        3
df.explode('column1', ignore_index=True)
输出


  column1  column2
0       a        1
1       b        1
2       c        1
3       d        2
4       e        2
5       f        2
6       g        3
7       h        3
8       i        3
  column1  column2
0       a        1
1       b        1
2       c        1
3       d        2
4       e        2
5       f        2
6       g        3
7       h        3
8       i        3

什么是打印(类型(df.ix[0,'column1'])?打印(类型(df.ix[0,'column1']))---我喜欢你的第二个吗solution@Kris-谢谢,它更好,所以现在是第一个。如果我们有多个
列2
,同样的方法会起作用吗?也就是说,如果我们有很多列,而保持
列1
,就像问题一样?@splinter:请看我关于熊猫0.23方法的回答,我已经在ty中包含了泛化pical pandas fashion,如果列由空列表组成,则此操作失败。完美。我相信此解决方案需要“column1”中的每个列表我想问题是关于第一列中长度相同的列表,但稍加修改,您可以使用不同的列表长度——参见我的编辑如果您使用的是pandas<0.25.0,我制作了一个补丁,使其在下面运行,我看到您的问题是对循环使用了大量的
,我不会建议人们这样做使用这种方法,是
熊猫<0.25.0
@ShivaRamaKrishna的更好矢量化替代方案