1 回答

TA貢獻1853條經驗 獲得超6個贊
問題2
有一種方法可以部分解決這個問題。我假設它df2比它小得多df1并且它實際上適合內存所以我們可以讀取作為 pandas 數(shù)據幀。df1如果是這種情況,如果是一個pandas或一個數(shù)據幀,則以下函數(shù)可以工作dask,但df2應該是pandas一個。
import pandas as pd
import dask.dataframe as dd
def replace_names(df1, # can be pandas or dask dataframe
df2, # this should be pandas.
idxCol='id',
srcCol='name',
dstCol='name'):
diz = df2[[idxCol, srcCol]].set_index(idxCol).to_dict()[srcCol]
out = df1.copy()
out[dstCol] = out[idxCol].map(diz)
return out
問題一
關于第一個問題,以下代碼適用于pandas和dask
df = pd.DataFrame({'a': {0: 1, 1: 2},
'b': {0: 3, 1: 4},
'1/1/20': {0: 10, 1: 10},
'1/2/20': {0: 20, 1: 30},
'1/3/20': {0: 0, 1: 30},
'1/4/20': {0: 40, 1: 0},
'1/5/20': {0: 0, 1: 0},
'1/6/20': {0: 50, 1: 50}})
# if you want to try with dask
# df = dd.from_pandas(df, npartitions=2)
cols = [col for col in df.columns if "/" in col]
df[cols] = df[cols].mask(lambda x: x==0).ffill(1) #.astype(int)
如果您希望輸出為整數(shù),請刪除最后一行中的注釋。
更新問題 2 如果您想要一個dask唯一的解決方案,您可以嘗試以下方法。
數(shù)據
import numpy as np
import pandas as pd
import dask.dataframe as dd
df1 = pd.DataFrame({'id': {0: 123, 1: 456, 2: 789, 3: 789, 4: 456, 5: 123},
'name': {0: 'city a',
1: 'city b',
2: 'city c',
3: 'city c',
4: 'city b',
5: 'city a'}})
df2 = pd.DataFrame({'id': {0: 123, 1: 456, 2: 789},
'name': {0: 'City A', 1: 'City B', 2: 'City C'}})
df1 = dd.from_pandas(df1, npartitions=2)
df2 = dd.from_pandas(df2, npartitions=2)
情況1
在這種情況下,如果一個id存在于df1但不存在于中,df2則將名稱保留在df1.
def replace_names_dask(df1, df2,
idxCol='id',
srcCol='name',
dstCol='name'):
if srcCol == dstCol:
df2 = df2.rename(columns={srcCol:f"{srcCol}_new"})
srcCol = f"{srcCol}_new"
def map_replace(x, srcCol, dstCol):
x[dstCol] = np.where(x[srcCol].notnull(),
x[srcCol],
x[dstCol])
return x
df = dd.merge(df1, df2, on=idxCol, how="left")
df = df.map_partitions(lambda x: map_replace(x, srcCol, dstCol))
df = df.drop(srcCol, axis=1)
return df
df = replace_names_dask(df1, df2)
案例二
在這種情況下,如果一個id存在于df1但不存在于df2則name輸出df將是NaN(如在標準左連接中)
def replace_names_dask(df1, df2,
idxCol='id',
srcCol='name',
dstCol='name'):
df1 = df1.drop(dstCol, axis=1)
df2 = df2.rename(columns={srcCol: dstCol})
df = dd.merge(df1, df2, on=idxCol, how="left")
return df
df = replace_names_dask(df1, df2)
添加回答
舉報