我以以下数据框为例。
df_test = pd.DataFrame(data=None, index=["green","yellow","red","pink"], columns=["bear","dog","cat"], dtype=None, copy=False)
我有以下字典,其中的键和值与数据框的索引和列相同或相关。
d = {"green":["bear","dog"], "yellow":["bear"], "red":["bear"]}
我想根据显示的键和值填充我的数据框,如果不存在该键,我想用空白填充。
所需的输出
我只能考虑制作列表并进行循环。有没有简单的方法来实现这一目标?或可以帮助我的功能?
答案 0 :(得分:2)
使用按字典循环并设置True
值,然后用Empty
用mask
替换所有丢失的行,最后用fillna
替换丢失的值:
for k, v in d.items():
for x in v:
df_test.loc[k, x] = 'Yes'
df_test = df_test.mask(df_test.isnull().all(axis=1), 'Empty').fillna('No')
print (df_test)
bear dog cat
green Yes Yes No
yellow Yes No No
red Yes No No
pink Empty Empty Empty
答案 1 :(得分:2)
您可以通过执行以下操作来实现自己的目标:
# You can use elements that are not in the original dataframe
# and the row will be filled with empty
index_list = ["green", "yellow", "red", "pink", "purple"]
replace_dict = {True: 'Yes', False: 'No', np.nan:'Empty'}
df_test.loc[list(d.keys())].apply(lambda x : pd.Series(x.index.isin(d[x.name]),
index=x.index), axis=1).reindex(index_list).replace(replace_dict)
bear dog cat
green Yes Yes No
yellow Yes No No
red Yes No No
pink Empty Empty Empty
purple Empty Empty Empty
说明
您可以通过检查dict的相应字段中是否存在数据框的列来完成所需的操作:
df_test.loc[list(d.keys())].apply(lambda x : pd.Series(x.index.isin(d[x.name]),
index=x.index), axis=1)
bear dog cat
green True True False
yellow True False False
red True False False
然后根据字典的键重新索引以填充查找丢失的颜色并将其填充为空:
index_list = ["green","yellow","red","pink", "purple"]
df_test.loc[list(d.keys())].apply(lambda x : pd.Series(x.index.isin(d[x.name]),
index=x.index), axis=1).reindex(index_list)
bear dog cat
green True True False
yellow True False False
red True False False
pink NaN NaN NaN
purple NaN NaN NaN
然后,如果要更改值,可以使用如下字典来替换它们:
replace_dict = {True: 'Yes', False: 'No', np.nan:'Empty'}
df_test.loc[list(d.keys())].apply(lambda x : pd.Series(x.index.isin(d[x.name]),
index=x.index), axis=1).reindex(index_list).replace(replace_dict)
bear dog cat
green Yes Yes No
yellow Yes No No
red Yes No No
pink Empty Empty Empty
purple Empty Empty Empty
答案 2 :(得分:1)
这是通过pd.get_dummies
和pd.DataFrame.reindex
:
df = pd.DataFrame.from_dict(d, orient='index')
res = pd.get_dummies(df.reindex(df_test.index), prefix='', prefix_sep='')\
.reindex(columns=df_test.columns)\
.fillna(0).applymap({0: 'No', 1: 'Yes'}.get)\
.reindex(index=np.hstack((df_test.index, df.index.difference(df_test.index))))\
.fillna('Empty')
print(res)
bear dog cat
green Yes Yes No
yellow Yes No No
red Yes No No
pink Empty Empty Empty