【问题标题】:what can I use instead of .loc when i also have NaN values in my table?当我的表中也有 NaN 值时,我可以使用什么来代替 .loc?
【发布时间】:2019-02-12 04:31:45
【问题描述】:

我想按他们的名字对一些运动员进行分组,从每个人那里得到最小的年龄,然后按他们的年龄从最小到最大对他们进行排序,但是在我的数据中也有一些 Nan 值,我得到了 FutureWarning: 将列表喜欢传递给带有任何缺失标签的 .loc 或 [] 将引发 KeyError 在未来,你可以使用 .reindex() 作为替代。 是否有任何选项可以跳过具有 Nan 值的记录?

这是我的代码,tab 是我从老师那里得到的 csv 文件中读取的表格:

tabYoungest=tab.sort_values(by='Age')  
tabYoungestgesamt=tabYoungest.loc[tabYoungest.groupby('Name')['Age'].idxmin()]
tabYoungestgesamt.head(20)

【问题讨论】:

  • 可能就像在.loc 中添加.dropna 一样简单:tabYoungest.groupby('Name')['Age'].idxmin().dropna()
  • 如果您不想丢失信息,可以使用.fillna() 更改这些值
  • 请提供MCVE您的数据。
  • 在我看来,你真正需要的只是tab.groupby('Name').min(),另外请注意,如果你不想改变你的方法,你可以使用tabYoungest.reindex(tabYoungest.groupby('Name')['Age'].idxmin())作为警告状态。
  • .dropna() 解决了我的问题 :) thx @ALollz

标签: python pandas


【解决方案1】:

IIUC 这可以通过使用.sort_values + groupby + head 更轻松地实现。输出将是每个名字的最小年龄,从最小到最大排序,所有名字最后都缺少年龄。

样本数据:

import pandas as pd
import numpy as np

np.random.seed(1)
tab = pd.DataFrame({'Name': list('ABCDEFGHIJ')*100,
                   'Age': np.random.normal(50,5,1000)})
tab.loc[1000] = ['Z', np.NaN]

代码:

tab = tab.sort_values('Age')
tab.groupby('Name').head(1)

     Name        Age
892     C  34.731178
661     B  36.045018
367     H  36.087328
738     I  36.508191
976     G  36.679370
589     J  37.418481
414     E  37.932485
5       F  38.492307
973     D  38.508971
790     A  39.568047
1000    Z        NaN

【讨论】:

  • 或者只是tab.groupby('Name').min()
  • @juanpa.arrivillaga 好点,在这里有效,然后是.sort 年龄,只要age 是唯一需要的信息。 .head(1) 更符合.loc[...idxmin()] 的输出,因为它带来了年龄最小的整行。
  • 在这种情况下您可以使用tab.groupby('Name').agg(['idxmin','min']),不过我怀疑head 可能更有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多