根据数据类型(float、Nan、string)对 Pandas 数据框的单列数据进行分组和拆分

Grouping and Splitting Data from a single column of a Pandas Dataframe Based on datatype (float,Nan,string)

根据我的具体问题,我尝试创建一个可重现的小示例,但没有达到目的。 附在问题的最后。

我目前正在阅读 27 excel 个文件。

所有的格式都一样(看起来所有的列都是一致的)。

我将此数据附加到由 9828 行和三列组成的单个 DataFrame 中。

名为"Target"的一列只能由浮点数或整数组成。

实际上构成目标列的单元格被读取为:

  1. 浮动
  2. 只有一种情况下,空单元格被读取为字符串
  3. 在其他情况下,空单元格被视为 None

为了了解哪个特定的 Column DataFrame 行包含 float/none/string 我创建了一种非常低效的方法来根据数据类型

检查和拆分数据框
    dt_t is a dataframe with 3 columns one of this is called Target
    This column is composed by 9398 non-null object. 
    The other two by 9828 non-null object.

    df_string=pd.DataFrame()
    df_float=pd.DataFrame()
    df_null=pd.DataFrame()

    for i in range(len(df_t.Target)):
      if type(df_t.Target.loc[i])==str:
         df_string=df_string.append(df_t.loc[i])
      if type(df_t.Target.loc[i])==int or type(df_t.Target.loc[i])==float:
          df_float=df_float.append(df_t.loc[i])
      else: 
          df_null=df_null.append(df_t.loc[i])

不明白为什么:

  1. 存在重复。 df_stringdf_null 包含相同的值

  2. 在浮动数据框中我还有 nan 个值

我的预期输出 是看到

  1. 一个数据帧中只有 float 和 int
  2. df_null
  3. 中只有 nan
  4. 只有 df_string 数据帧中的字符串

提取 nan 值最优雅的方法是 但我认为我的问题略有不同

df.loc[~df.index.isin(df.dropna().index)]

我也试图找到一些资源并阅读文档以了解为什么 pd.read_excel() 有这种行为,但我没有找到任何有用的东西。

这里是我尝试为可重现的问题创建的代码(但不起作用):

    a=pd.Series(np.random.uniform(1.00,100.00,9000))
    b=np.empty(400)
    b=pd.Series(np.full_like(b,np.nan))
    c=pd.Series('None')
    start_dict={"Target":[0,2,3.5] }
    df_t=pd.DataFrame(start_dict)
    df_t=pd.concat([df_t,a],axis=0,ignore_index=True)
    df_t=pd.concat([df_t,b],axis=0,ignore_index=True)
    df_t=pd.concat([df_t,c],axis=0,ignore_index=True)

这是我打印 df_stringdf_null 时的实际输出:

xlsx 文件中的黄色参考单元格:

类型使用不安全。由于列具有混合类型 pandas 将对所有行使用 object 类型。但是,您可以通过其他方式执行此操作。

首先创建空数据帧:

df_string = pd.DataFrame()
df_float = pd.DataFrame()
df_null = pd.DataFrame()

现在您需要创建一个函数来对您的原始 DataFrame 进行分类。 this question 的稍微修改版本应该做:

def categorize(x):
    if x.isna():
        df_null = df_null.append([x]) # append does not change the original df
        return
    try:
        float(x)
    except ValueError:
        df_string = df_string.append([x])
    else:
        df_float = df_float.append([x])

现在您所要做的就是 apply Target 列的函数。

df['Target'].apply(lambda x: categorize(x), axis=1)