Python “如何工作”;将包含列表的单元格展开到pandas中各自的变量中;

Python “如何工作”;将包含列表的单元格展开到pandas中各自的变量中;,python,pandas,list,Python,Pandas,List,显示如何将包含列表的单元格展开到其自身的变量中。 还有这个解决方案: df.apply(lambda x: pd.Series(x['tags']),axis=1) 但我不明白它是怎么工作的。任何人都可以解释。它意味着将列标记的每个值转换为系列,这些值被转换为数据帧——它将系列组合在一起axis=1按行表示进程,其中每行转换为系列,因此需要x['tags']选择tags 还可以创建自定义功能,以便更好地检查每个步骤: def f(x): #each row is convert to

显示如何将包含列表的单元格展开到其自身的变量中。 还有这个解决方案:

df.apply(lambda x: pd.Series(x['tags']),axis=1)

但我不明白它是怎么工作的。任何人都可以解释。

它意味着将列
标记的每个值转换为
系列
,这些值被转换为
数据帧
——它将
系列
组合在一起
axis=1
按行表示进程,其中每行转换为系列,因此需要
x['tags']
选择
tags

还可以创建自定义功能,以便更好地检查每个步骤:

def f(x):
    #each row is convert to Series
    print (x)
    #select row tags
    print (x['tags'])

    #convert list to Series
    return pd.Series(x['tags'])

tags = df.apply(f,axis=1)
print (tags)
如果性能很重要且数据帧较大,则最好使用:

tags = pd.DataFrame(df['tags'].values.tolist())
print (tags)
       0     1      2
0  apple  pear  guava
1  truck   car  plane
2    cat   dog  mouse
性能

# create a dataset
raw_data = {'score': [1,2,3], 
        'tags': [['apple','pear','guava'],['truck','car','plane'],['cat','dog','mouse']]}
df = pd.DataFrame(raw_data, columns = ['score', 'tags'])

# view the dataset
#print (df)

#3000 rows
df = pd.concat([df] * 1000, ignore_index=True)


In [110]: %timeit df.apply(lambda x: pd.Series(x['tags']),axis=1)
792 ms ± 27.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [111]: %timeit df['tags'].apply(pd.Series)
681 ms ± 16.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [112]: %timeit pd.DataFrame(df['tags'].values.tolist())
715 µs ± 8.91 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

apply允许您将数据帧的所有行(轴=1)或列(轴=0)传递给函数,该函数作为参数提供给apply函数。基本上是你写的

DataFrame.apply(function, axis)
其中函数可以像numpy sum函数一样进行预定义,也可以声明lambda表达式

在这种情况下,数据帧“df”的每一行“x”都作为一个Series对象传递给函数“pd.Series(x['tags'])。对于每一行,“标记”列的值将用于创建新的系列对象

如果对所有行执行此操作,则最终将得到一组单系列对象,这些对象在最后用于创建新的数据帧