使用列表理解修改数据框列

Lui*_*uez 5 python pandas

我有一个包含大约 90k 个字符串的列表和一个包含多列的数据框,我有兴趣检查列表的字符串是否在 column_1 中,以及它是否在 column_2 中分配了相同的值。

我可以做这个:

for i in range(len(my_list)):
    item = list[i]
    for j in range(len(df)):
         if item == df['column_1'][j]:
             df['column_2'][j] = item
Run Code Online (Sandbox Code Playgroud)

但我宁愿避免嵌套循环

我试过这个

for item in my list:
    if item in list(df['column _1']):
          position = df[df['column_1']==item]].index.values[0]
          df['column_2'][position]  = item
Run Code Online (Sandbox Code Playgroud)

但我认为这个解决方案更慢更难阅读,这个操作可以通过简单的列表理解来完成吗?

编辑。

第二个解决方案要快得多,大约一个数量级。这是为什么?似乎在这种情况下它必须搜索两次以获得马赫:

这里:

if item in list(df['column _1'])
Run Code Online (Sandbox Code Playgroud)

和这里:

possition = df[df['column_1]=='tem]].index.values[0]
Run Code Online (Sandbox Code Playgroud)

我仍然更喜欢更简单的解决方案。

小智 5

您可以通过将您描述的过滤和分配操作分为两个不同的步骤来完成此操作。

Pandas 系列对象包含一个“isin”方法,可以让您识别 column_1 值位于 my_list 中的行,并将结果保存在布尔值系列中。这又可以与 .loc 索引方法一起使用,将相应行中的值从第 1 列复制到第 2 列

# Identify the matching rows
matches = df['column_1'].isin(my_list)
# Set the column_2 entries to column_1 in the matching rows
df.loc[matches,'column_2'] = df.loc[matches,'column_1']
Run Code Online (Sandbox Code Playgroud)

如果column_2尚不存在,则此方法将创建column_2并将non_matching值设置为NaN。.loc 方法用于避免在执行索引操作时对数据副本进行操作。