dask assign()或apply()函数中的可变列名

4

我有一段在pandas中可以正常工作的代码,但是我在尝试将其转换为使用dask时遇到了麻烦。这里有一个部分解决方案(链接),但它不允许我使用变量作为我正在创建/分配列名的名称。

下面是可用的pandas代码:

percent_cols = ['num_unique_words', 'num_words_over_6']

def find_fraction(row, col):
    return row[col] / row['num_words']

for c in percent_cols:
    df[c] = df.apply(find_fraction, col=c, axis=1)

这是我不想要的dask代码:
data = dd.from_pandas(df, npartitions=8)

for c in percent_cols:
    data = data.assign(c = data[c] / data.num_words)

这将结果分配给名为c的新列,而不是修改data[c]的值(我想要的)。如果可以将列名作为变量,则创建新列将是可以接受的。例如,如果以下内容有效:

for c in percent_cols:
    name = c + "new"
    data = data.assign(name = data[c] / data.num_words)

显而易见的是,Python不允许在等号左侧使用表达式,并忽略了先前name的值。
我如何使用一个变量作为我分配的列名?循环迭代的次数比我愿意复制/粘贴的次数要多得多。
1个回答

3

这可以被理解为一个关于Python语言的问题:

问题:如何将变量的值用作关键字参数中的名称?

答案:使用字典和**解包。

c = 'name'
f(c=5)       # 'c' is used as the keyword argument name, not what we want
f(**{c: 5})  # 'name' is used as the keyword argument name, this is great

Dask.dataframe解决方案

针对您的问题,我建议采用以下方法:

d = {col: df[col] / df['num_words'] for col in percent_cols}
df = df.assign(**d)

考虑使用Pandas进行操作

.assign方法在Pandas中也可用,可能比使用.apply更快。


你能解释一下 d = 这行代码在做什么吗? - kaz
我们创建一个字典,将列名映射到我们想要放入数据框中的新列。这与循环调用assign相同。 - MRocklin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接