【问题标题】:filling out missing values in pandas dataframe填写熊猫数据框中的缺失值
【发布时间】:2019-08-01 02:02:54
【问题描述】:

python 新手,但似乎无法找到我正在寻找的确切答案 我相信有一种更简单的方法来填写此信息

我有 df1 和 df2

df1: FirstName  LastName  PhNo  uniqueid

df2: uniqueid PhNo

我想填充 df1['PhNo'] 中缺少的值,并根据匹配的 uniqueid == uniqueid 使用 df2 中的匹配值

我使用的代码如下

dff = pd.merge(df1,df2,on = 'uniqueid', how = 'Left')
dff['PhNo'] = 0
dff['PhNo'][df1['PhNo_x'] >= 1] = df1['PhNo_x']
df1['PhNo'][df2['PhNo_y'] >= 1] = df1['PhNo_y']

这似乎可以完成工作,但似乎不是一种有效的方法。我正在寻找比合并更少的行数和更好的技术

df1

FirstName  LastName  PhNo    uniqueid
Sam        R         123x    1
John       S         345x    2
Paul       K         np.Nan  3
Laney      P         no.NaN  4

df2

uniqueid  PhNo
1         213x
3         675x
4         987x

想要的输出:df1

FirstName  LastName  PhNo    uniqueid
Sam        R         123x    1
John       S         345x    2
Paul       K         **675x**    3
Laney      P         **987x**    4

【问题讨论】:

  • 你能添加一些数据样本,4-5 行预期输出吗?
  • 我按要求添加了数据样本...
  • 谢谢,所以解决方案效果很好?

标签: python pandas dataframe


【解决方案1】:

我相信你需要Series.mapSeries.fillna

df1 = pd.DataFrame({
        'FirstName':list('abcdef'),
        'LastName':list('aaabbb'),
         'PhNo':[7,np.nan,9,4,np.nan,np.nan],
         'uniqueid':[5,3,6,9,2,4],

})

print (df1)
  FirstName LastName  PhNo  uniqueid
0         a        a   7.0         5
1         b        a   NaN         3
2         c        a   9.0         6
3         d        b   4.0         9
4         e        b   NaN         2
5         f        b   NaN         4

df2 = pd.DataFrame({
         'PhNo':[10,90,30,20],
         'uniqueid':[3,6,9,4],

})
print (df2)
   PhNo  uniqueid
0    10         3
1    90         6
2    30         9
3    20         4

s = df2.set_index('uniqueid')['PhNo']
df1['PhNo'] = df1['PhNo'].fillna(df1['uniqueid'].map(s))
print (df1)
  FirstName LastName  PhNo  uniqueid
0         a        a   7.0         5
1         b        a  10.0         3
2         c        a   9.0         6
3         d        b   4.0         9
4         e        b   NaN         2
5         f        b  20.0         4

【讨论】:

  • @anky_91 - 我要求 100% 验证的数据 :)
  • @jezrael 我得到的是 0 而不是 df2 的值
  • @jezrael 发现了错误,我的数据库有“0”而不是空字符串,但 df1['PhNo'].replace(0,np.nan,inplace=True) 成功了。类似的解决方案是否适用于“0”值,还是我应该将其作为单独的问题发布?
  • @Shri - 使用0 是解决方案df1['PhNo'] = np.where(df1['PhNo'] == 0, df1['uniqueid'].map(s), df1['PhNo'])
【解决方案2】:

DataFrame.fillna(value= &n)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2018-08-14
    • 2017-08-21
    • 1970-01-01
    相关资源
    最近更新 更多