如何将元素追加到DataFrame内部的列表中?

G F*_*G F 4 python dataframe pandas

假设我有一个列表的DataFrame,

 my_df = pd.DataFrame({'my_list':[[45,12,23],[20,46,78],[45,30,45]]})
Run Code Online (Sandbox Code Playgroud)

结果如下:

         my_list
0  [45, 12, 23]
1  [20, 46, 78]
2  [45, 30, 45]
Run Code Online (Sandbox Code Playgroud)

如何my_list为每行添加一个元素(例如99)?

预期结果 :

         my_list
0  [45, 12, 23, 99]
1  [20, 46, 78, 99]
2  [45, 30, 45, 99]
Run Code Online (Sandbox Code Playgroud)

Max*_*axU 5

In [90]: my_df['my_list'] += [99]

In [91]: my_df
Out[91]:
            my_list
0  [45, 12, 23, 99]
1  [20, 46, 78, 99]
2  [45, 30, 45, 99]
Run Code Online (Sandbox Code Playgroud)


mir*_*ulo 5

听起来非常无聊,但只需直接迭代这些值 - 这样您就可以调用append并避免发生任何重新绑定+=,从而使事情变得更快。

for val in my_df.my_list:
    val.append(99)
Run Code Online (Sandbox Code Playgroud)

演示

>>> import timeit
>>> setup = '''
import pandas as pd; import numpy as np
df = pd.DataFrame({'my_list': np.random.randint(0, 100, (500, 500)).tolist()})
'''

>>> min(timeit.Timer('for val in df.my_list: val.append(90)', 
                     setup=setup).repeat(10, 1000))
0.05669815401779488

>>> min(timeit.Timer('df.my_list += [90]', 
                     setup=setup).repeat(10, 1000))
2.7741127769695595
Run Code Online (Sandbox Code Playgroud)

当然,如果速度(或者即使不是速度)对您很重要,您应该质疑是否真的需要在 DataFrame 中包含列表。考虑使用 NumPy 数组,直到您需要 Pandas 实用程序并执行类似的操作

np.c_[arr, np.full(arr.shape[0], 90)]
Run Code Online (Sandbox Code Playgroud)

或者至少将 DataFrame 内的列表拆分为单独的列并分配一个新列。