如何"expand cells containing lists into their own variables in pandas"工作



这里显示了如何在熊猫中将包含列表的单元格扩展为自己的变量。也有这个解决方案:

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

但我不明白它是如何工作的。任何人都可以解释这一点。

这意味着将列 tags 的每个值转换为 Series ,这些值将转换为DataFrame - 它Series连接在一起。 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

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

DataFrame.apply(function, axis)

其中函数可以像 numpy sum-function 一样预先定义,或者您可以声明一个 lambda 表达式。

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

如果对所有行执行此操作,则最终会得到一堆单个 Series 对象,这些对象在末尾用于创建新的数据帧。

最新更新