我有适用于pandas
,但我在将其转换为使用时遇到问题dask
。有一个部分解决方案here https://stackoverflow.com/questions/32363114/how-do-i-change-rows-and-columns-in-a-dask-dataframe,但它不允许我使用变量作为我正在创建/分配的列的名称。
这是工作中的pandas
code:
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
.
如何使用变量作为我要分配给的列的名称?循环迭代的次数远远超过我愿意复制/粘贴的次数。
这可以解释为Python语言问题:
Question:如何使用变量的值作为关键字参数中的名称?
Answer:使用字典并**
拆包
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 这样做
The .assign
方法在 Pandas 中也可用,并且可能比使用更快.apply
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)