使用字典将一些列添加到具有分配功能的数据框中

Posted

技术标签:

【中文标题】使用字典将一些列添加到具有分配功能的数据框中【英文标题】:Using dictionary to add some columns to a dataframe with assign function 【发布时间】:2020-02-02 23:20:44 【问题描述】:

我正在使用 python 和 pandas 对数据进行一些统计分析,有时我需要添加一些具有分配功能的新列

df_res = (
    df
    .assign(col1 = lambda x: np.where(x['event'].str.contains('regex1'),1,0))
    .assign(col2 = lambda x: np.where(x['event'].str.contains('regex2'),1,0))
    .assign(mycol = lambda x: np.where(x['event'].str.contains('regex3'),1,0))
    .assign(newcol = lambda x: np.where(x['event'].str.contains('regex4'),1,0))
)

我想知道是否有任何方法可以将列名和我的正则表达式添加到字典中,并使用 for 循环或其他 lambda 表达式自动分配这些列:

Dic = 'col1':'regex1','col2':'regex2','mycol':'regex3','newcol':'regex4'

df_res = (
    df
    .assign(...using Dic here...)
)

我需要稍后添加更多列,我认为以后添加新列会更容易。

【问题讨论】:

对于 Dic.items() 中的 k,v:df[k] = df['event'].str.contains(v).astype(int) ? 【参考方案1】:

如果我正确理解您的问题,您正在尝试重命名列,在这种情况下,我认为您可以使用 Pandas rename function。这看起来像

df_res = df_res.rename(mapper=Dic)

-本

【讨论】:

【参考方案2】:

这可以做你想做的事

pd.concat([df,pd.DataFrame(a:list(df["event"].str.contains(b)) for a,b in Dic.items())],axis=1)

其实用for循环也是一样的

【讨论】:

谢谢@Luk。你能帮我分配方法吗? @mGolzadh 我发现使用 assign 很难做到这一点,尽管文档说明我们肯定可以做类似 ***.com/a/58244022/10189759 的事情,但是我认为在实现它时存在错误。此外,如果您尝试使用 for 循环,则每个循环中的变量都无法引用它应该引用的内容。该函数只需使用循环变量的名称作为列名【参考方案3】:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.assign.html

可以在同一个分配中分配多个列。对于 Python 3.6 及更高版本,“**kwargs”中的后续项目可能会引用“df”中新创建或修改的列;项目被计算并按顺序分配到“df”中。对于 Python 3.5 及以下版本,未指定关键字参数的顺序,您不能引用新创建或修改的列。首先计算所有项目,然后按字母顺序分配。 在 0.23.0 版中更改:为 Python 3.6 及更高版本维护关键字参数顺序。

如果您映射所有正则表达式,以便每个字典值包含一个 lambda 而不仅仅是正则表达式,您可以简单地将 dic 解压缩到 assign:

lambda_dict = 
    col:
    lambda x, regex=regex: (
        x['event'].
        str.contains(regex)
        .astype(int)
    ) 
    for col, regex in Dic.items()

res = df.assign(**lambda_dict)

编辑 这是一个例子:

import pandas as pd
import random

random.seed(0)
events = ['apple_one', 'chicken_one', 'chicken_two', 'apple_two']
data = [random.choice(events) for __ in range(10)]
df = pd.DataFrame(data, columns=['event'])

regex_dict = 
        'apples': 'apple',
        'chickens': 'chicken',
        'ones': 'one',
        'twos': 'two',


lambda_dict = 
    col:
    lambda x, regex=regex: (
        x['event']
        .str.contains(regex)
        .astype(int)
    )
    for col, regex in regex_dict.items()


res = df.assign(**lambda_dict)
print(res)

# Output
         event  apples  chickens  ones  twos
0    apple_two       1         0     0     1
1    apple_two       1         0     0     1
2    apple_one       1         0     1     0
3  chicken_two       0         1     0     1
4    apple_two       1         0     0     1
5    apple_two       1         0     0     1
6  chicken_two       0         1     0     1
7    apple_two       1         0     0     1
8  chicken_two       0         1     0     1
9  chicken_one       0         1     1     0

之前代码的问题是正则表达式只在最后一个循环中被评估。将其添加为默认参数可以解决此问题。

【讨论】:

谢谢@adrianp,但我认为有问题,因为输出不正确。 我编辑了答案。你能看看这是否是你的预期输出吗?

以上是关于使用字典将一些列添加到具有分配功能的数据框中的主要内容,如果未能解决你的问题,请参考以下文章

将列表中具有零值的多个列添加到 Pandas 数据框中

如何在该字典中引用 Pandas 数据框中的键?

R中的高效方法是将新列添加到具有大数据集的数据框中

将字典添加为数据框中的新行

如何将原始数据框中的列添加到报废数据?

将具有多个键的 Python 字典映射到具有多个匹配键的列的数据框中