如果数值数据类型列 Pandas 数据框中的值为 str,则打印索引和值

Posted

技术标签:

【中文标题】如果数值数据类型列 Pandas 数据框中的值为 str,则打印索引和值【英文标题】:print index and value if value is str in a numeric data type column pandas dataframe 【发布时间】:2017-10-21 17:43:43 【问题描述】:

我是数据科学的新手,目前我正在进一步探索。我有超过 600,000 列的数据集,我目前正在清理并检查它是否存在不一致或异常值。我遇到了一个我不知道如何解决的问题。我有一些解决方案,但我不确定如何使用 pandas。

我已将某些列的数据类型从 object 转换为 int。我没有收到任何错误,并检查了它是否在 int 中。我检查了一列的值以检查事实数据。这涉及年龄,我收到一个错误,说我的列有一个字符串。所以我用这个方法检查了它:

print('if there is string in numeric column',np.any([isinstance(val, str) for val in homicide_df['Perpetrator Age']])

现在,我想打印所有索引及其值,并且只在具有字符串数据类型的列上键入。

目前我想出了这个工作正常的解决方案:

def check_type(homicide_df):
    for age in homicide_df['Perpetrator Age']:
        if type(age) is str:
            print(age, type(age))
check_type(homicide_df)

以下是我的一些问题:

    有熊猫方法可以做同样的事情吗? 我应该如何将这些元素转换为 int? 为什么列中的某些元素没有转换为 int?

如果有任何帮助,我将不胜感激。非常感谢

【问题讨论】:

print(age, type(age)) 的输出是什么? NaNs ? non numerics ? @jezrael all which print 【参考方案1】:

你可以使用iteritems:

def check_type(homicide_df):
    for i, age in homicide_df['Perpetrator Age'].iteritems():
        if type(age) is str:
            print(i, age, type(age))

homicide_df = pd.DataFrame('Perpetrator Age':[10, '15', 'aa'])
print (homicide_df)
  Perpetrator Age
0              10
1              15
2              aa


def check_type(homicide_df):
    for i, age in homicide_df['Perpetrator Age'].iteritems():
        if type(age) is str:
            print(i, age, type(age))

check_type(homicide_df)
1 15 <class 'str'>
2 aa <class 'str'>

如果值是混合的 - 数字与非数字,最好检查:

def check_type(homicide_df):
    return homicide_df.loc[homicide_df['Perpetrator Age'].apply(type)==str,'Perpetrator Age']

print  (check_type(homicide_df))
1    15
2    aa
Name: Perpetrator Age, dtype: object

如果所有值都是数字,但所有types 都是str

print ((homicide_df['Perpetrator Age'].apply(type)==str).all())
True

homicide_df = pd.DataFrame('Perpetrator Age':['10', '15'])

homicide_df['Perpetrator Age'] = homicide_df['Perpetrator Age'].astype(int)
print (homicide_df)

   Perpetrator Age
0               10
1               15

print (homicide_df['Perpetrator Age'].dtypes)
int32

但是如果一些带有字符串的数字:

使用to_numeric 转换为int 的解决方案将非数值替换为NaN。然后有必要将NaN 替换为0 之类的数字,最后转换为int

homicide_df = pd.DataFrame('Perpetrator Age':[10, '15', 'aa'])

homicide_df['Perpetrator Age']=pd.to_numeric(homicide_df['Perpetrator Age'], errors='coerce')
print (homicide_df)
   Perpetrator Age
0             10.0
1             15.0
2              NaN

homicide_df['Perpetrator Age'] = homicide_df['Perpetrator Age'].fillna(0).astype(int)
print (homicide_df)
   Perpetrator Age
0               10
1               15
2                0

【讨论】:

非常感谢!这解决了我的问题!每一步都检查它。请问您是否知道为什么我转换列时某些值没有转换为int?我在转换列时使用了df[['col1','col2']]=df[['col1','col2']].apply(to_numeric, errors = 'ignore') 方法 我认为如果使用errors = 'ignore' 它只转换数字和非数字不会改变。所以混合types - 带字符串的整数。 我明白了。感谢您的洞察力。 我认为 600 000 是巨大的 df,对于另一个数据处理,最好的方法是创建小数据样本,使用您的代码(易于验证的输出),然后将解决方案应用于大数据框。祝你好运! 非常感谢!这是我第一次使用这么多数据,所以我还在学习。我将研究从大量数据中获取样本数据的最佳方法。

以上是关于如果数值数据类型列 Pandas 数据框中的值为 str,则打印索引和值的主要内容,如果未能解决你的问题,请参考以下文章

将 Pandas 数据框中的所有列相乘

将 Pandas 数据框中的所有列相乘

如何根据 pandas 数据框中的数据类型填充 NaN 值?

如何判断 pandas 数据框中的列是不是为 datetime 类型?如何判断一列是不是为数字?

在 Pandas 数据框中查找唯一值,无论行或列位置如何

在 Pandas 数据框中追加或添加行