我的代码适用于pandas
,但我无法将其转换为使用dask
。有一个部分解决方案here,但它不允许我使用变量作为我创建/分配的列的名称。
这是工作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
的先前值。
如何将变量用于我指定的列的名称?循环迭代的次数远远超过我愿意复制/粘贴的次数。
答案 0 :(得分:2)
这可以解释为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
对于您的特定问题,我建议如下:
d = {col: df[col] / df['num_words'] for col in percent_cols}
df = df.assign(**d)
Pandas中也提供.assign
方法,可能比使用.apply
更快。