【发布时间】:2021-09-09 06:30:53
【问题描述】:
如何对 dask 数据帧执行与下面的代码相同的操作。
df['new_column'] = 0
for i in range(len(df)):
if (condition):
df[i,'new_column'] = '1'
else:
df[i,'new_column'] = '0'
我想向 dask 数据框添加一个新列并将 0/1 插入新列。
【问题讨论】:
如何对 dask 数据帧执行与下面的代码相同的操作。
df['new_column'] = 0
for i in range(len(df)):
if (condition):
df[i,'new_column'] = '1'
else:
df[i,'new_column'] = '0'
我想向 dask 数据框添加一个新列并将 0/1 插入新列。
【问题讨论】:
如果您不希望按照 Rajnish kumar 的建议进行计算,您也可以使用以下几行:
import dask.dataframe as dd
import pandas as pd
import numpy as np
my_df = [{"a": 1, "b": 2}, {"a": 2, "b": 3}]
df = pd.DataFrame(my_df)
dask_df = dd.from_pandas(df, npartitions=2)
dask_df["c"] = dask_df.apply(lambda x: x["a"] < 2,
axis=1,
meta=pd.Series(name="c", dtype=np.bool))
dask_df.compute()
输出:
a b c
0 1 2 True
1 2 3 False
条件(这里检查是否在列"a" < 2 中的条目)逐行应用。请注意,根据您的条件和其中的依赖关系,它可能不一定那么简单,但在这种情况下,您可以分享有关您的条件需要什么的额外信息。
【讨论】:
DataFrame 中有 5 个大小相同的分区,如果每个分区包含 0.2 1s 的一小部分会很好,或者该条件是否也涵盖单个分区的情况包含比其他更多的1?应该有 20% 的 1 是预期的还是正好是 20%?
您不能直接对 Dask Dataframe 执行此操作。您首先需要计算它。使用这个,它会工作的。
df = df.compute()
for i in range(len(df)):
if (condition):
df[i,'new_column'] = '1'
else:
df[i,'new_column'] = '0'
这背后的原因是Dask Dataframe是dataframe schema的表示,它分为dask-delayed task。希望对你有帮助。
【讨论】:
我正在通过这些答案来解决我面临的类似问题。
这对我有用。
def extractAndFill(df, datetimeColumnName):
# Add 4 new columns for weekday, hour, month and year
df['pickup_date_weekday'] = 0
df['pickup_date_hour'] = 0
df['pickup_date_month'] = 0
df['pickup_date_year'] = 0
# Iterate through each row and update the values for weekday, hour, month and year
for index, row in df.iterrows():
# Get weekday, hour, month and year
w, h, m, y = extractDateParts(row[datetimeColumnName])
# Update the values
row['pickup_date_weekday'] = w
row['pickup_date_hour'] = h
row['pickup_date_month'] = m
row['pickup_date_year'] = y
return df
df1.compute()
df1 = extractAndFill(df1, 'pickup_datetime')
【讨论】: