【问题标题】:pandas read_CSV empty column treated as NaN?pandas read_CSV 空列被视为 NaN?
【发布时间】:2020-03-26 11:11:24
【问题描述】:

我正在使用 Panda read_csv。大多数行的最后一列是缺失数据,如下面的示例所示。但是在几行上,数据就在那里。与其将其视为空值,不如将其视为 NAN。我试图创建一个 if 语句来仅显示该列中包含数据的行。

(从美国运通到 CSV 的示例摘录):

2018 年 1 月 1 日星期一,“GOOGLE *SVCSAPPS_NEALW - CC@GOOGLE.COM, CA”,尼尔 Walters,XXXX-XXXXXX-XXXXX,,,4.16,,,GOOGLE SERVICES,"1600 AMPHITHEATER PKWYMOUNTAIN VIEWCA","94043-1351UNITED STATES",'320180020394601453',

colnames=['DateTime', 'NotUsed2', 'PayeeLong', 'NotUsed4', 'NotUsed5', 'NotUsed6', 'NotUsed7', 'Amount', 'NotUsed9',
          'NotUsed10', 'Payee', 'PayeeAddress', 'PayeeCountry', 'NotUsedX', 'AmexCategory']
data = pd.read_csv(filenameAmexGold, names=colnames, header=None)
# Preview the first 5 lines of the loaded data
print (data.head())

for j in range(len(data)):
    #if not(math.isnan(data['AmexCategory'][j])):
    #    if data['AmexCategory'][j] > ' ':
            print("Row ", j, data['DateTime'][j], data['Payee'][j], data['Amount'][j],
                 "AmexCat=", data['AmexCategory'][j],
                 "PayeeLong=", data['PayeeLong'][j] )

data.head 的示例输出...

          DateTime  NotUsed2  ...              NotUsedX AmexCategory
0  01/01/2018  Mon       NaN  ...  '320180021453'          NaN
1  01/02/2018  Tue       NaN  ...  '320180035375'          NaN
2  01/04/2018  Thu       NaN  ...  '320180043184'          NaN
3  01/08/2018  Mon       NaN  ...  '320180080899'   'Software'
4  01/13/2018  Sat       NaN  ...  '320180133142'          NaN

当我包含两个注释掉的 if 语句时,我得到这个错误:

TypeError: 必须是实数,不是 str

第二部分

同样,第 19 行没有 PAYEE,因为这是付款,而不是收费。

2018 年 1 月 26 日星期五,20,自动付款 - 谢谢,尼尔 沃尔特斯,XXXX-XXXXXX-XXXXX,,,-347.52,,,,,,'320180260752306017',

我知道这一行在 data.head(20) 中显示为 NaN,所以我想知道如何测试它是否为 null 或 NaN。当我列出 dtypes 时,它表明 Payee 是一个对象(不是浮点数)。对我来说,这只是一个字符串字段,但我想那是一个对象。

#This test works 
print("Test2", dfAmexGold['Payee'][19])
if (math.isnan( dfAmexGold['Payee'][19])):
   print("found a NAN value")

print("Test1", dfAmexGold['Payee'][20])
if (math.isnan( dfAmexGold['Payee'][20])):
   print("found a NAN value")

第 20 行的测试结果如下:

TypeError: 必须是实数,不是 str

问题是如何对单个项目进行 If 测试,以及为什么对空单元格使用 Null 而不是 NaN 不一致。

我也尝试过,但这不会将该行显示为 NULL(但也不会爆炸)。 如果 dfAmexGold['Payee'][19] 为无: print("找到一个 NULL 值")

【问题讨论】:

    标签: python-3.x pandas csv


    【解决方案1】:

    只显示该列中有数据的行

    只需删除特定列子集中具有缺失值的行:

    data = pd.read_csv(filenameAmexGold, names=colnames, header=None)
    data.dropna(subset=['AmexCategory'])
    

    【讨论】:

    • 我不想永久删除它们。我的第一遍只是显示该列中包含非空白数据的行。我可以在 if 语句中使用它来帮助对包含它的行进行分类,而其他行,我将使用其他一些逻辑进行分类。所以我需要测试该行是否有数据,而不会出现关于 NaN 的奇怪错误。
    • 我也有 PAYEE 为空白的情况,例如向信用卡公司付款。我尝试了 dfAmexGold = dfAmexGold.dropna(subset=['Payee']),但它没有删除该行。我阅读了文档,但发现它非常混乱。它说子集是“包含”的列。
    【解决方案2】:

    您可以在缺少值的列上使用pandas.DataFrame.isnull,并通过boolean indexing删除受影响的行:

    colnames=['DateTime', 'NotUsed2', 'PayeeLong', 'NotUsed4', 'NotUsed5', 'NotUsed6', 'NotUsed7', 'Amount', 'NotUsed9',
              'NotUsed10', 'Payee', 'PayeeAddress', 'PayeeCountry', 'NotUsedX', 'AmexCategory']
    
    data = pd.read_csv(filenameAmexGold, names=colnames, header=None)
    
    data = data[~data['AmexCategory'].isnull()]
    
    print(data.head())
    

    【讨论】:

    • 不想删除行,只需遍历它们并测试值。
    • 为什么它们是 NaN 而不是 null?
    • 在我的“收款人”列上尝试了上面的代码,当付款(相对于收费)时,该列有一个“空单元格”。该字段是 nan,而不是 null,因此 .isnull 是您的示例似乎不起作用。
    • 在这种情况下,您可以执行 data = data[~data['Payee']=='']。要循环数据框,如果发现使用 pandas 的 iterrows 函数更容易pandas.pydata.org/pandas-docs/stable/reference/api/…
    【解决方案3】:

    不确定这是最好的答案,但现在它让我继续前进:

    data.fillna('', inplace=True)

    熊猫文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html

    堆栈溢出:Get pandas.read_csv to read empty values as empty string instead of nan

    【讨论】:

      猜你喜欢
      • 2020-04-28
      • 2020-02-19
      • 2016-12-13
      • 2021-12-20
      • 1970-01-01
      • 2013-01-21
      • 2013-04-15
      • 1970-01-01
      • 2017-04-07
      相关资源
      最近更新 更多