根据字典/索引映射替换熊猫列中的值

时间:2019-01-05 17:50:32

标签: python pandas dataframe replace

我有字典

dicts: {0: '1969',  1: '1971',  2: '76'}

我还有以下df:

    Start date      End Date
0       w              a
1       A              2
2       B             NaN

现在我想将字典替换为一个DataFrame列

df = df.replace({'Start date': dicts})

结果:什么都没有改变:(

预期:

    Start date      End Date
0       1969           a
1       1971           2
2       76            NaN

3 个答案:

答案 0 :(得分:1)

我认为这里更合适的选择是将您的词典转换为Series并调用update

df['Start date'].update(pd.Series(dct))
df

  Start date End Date
0       1969        a
1       1971        2
2         76      NaN

replace不起作用,因为它要求字典包含{:},但是您提供了索引。因此,简而言之,要使replace工作,您需要做

dct2 = {df.at[i, 'Start date']: v for i, v in dct.items()}
df.replace({'Start date': dct2})

  Start date End Date
0       1969        a
1       1971        2
2         76      NaN

答案 1 :(得分:1)

您还可以执行以下操作:

import pandas as pd
#Creating Your DataFrame
d= {'Start Date': ['w','a','b'],'End Date': ['a',2,'Nan']}
df=pd.DataFrame(data=d)

#Assigning Your Dict Column
dicts = {0: '1969',  1: '1971',  2: '76'}
df['Start Date']= pd.DataFrame.from_dict(dicts, orient='index')
df

在此处查看字典到数据框的文档: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.from_dict.html

答案 2 :(得分:1)

pd.DataFrame.replace替换为值,而不是索引对齐。对于后者,一种选择是通过字典pd.Index.map进行索引:

dicts = {0: '1969',  1: '1971',  2: '76'}
df['StartDate'] = df.index.map(dicts)

print(df)

  StartDate EndDate
0      1969       a
1      1971       2
2        76     NaN

如果可能存在未映射索引,则可以将fillna与一系列序列一起使用:

df['StartDate'] = pd.Series(df.index.map(dicts)).fillna(df['StartDate'])