熊猫:为什么我的标头插入到数据框的第一行?

时间:2019-01-03 02:38:05

标签: python pandas dataframe jupyter-notebook

我有一个脚本,用于整理其他数据框中的标记集,将它们转换为逗号分隔的字符串,并将所有这些都添加到新的数据框中。如果我使用pd.read_csv生成数据帧,则第一个条目就是我期望的。但是,如果我使用df_empty脚本(如下),则会获得第一行中标头的副本,而不是所需的数据。我所做的唯一区别是生成了一个新的数据框,而不是加载一个。

resultData = pd.read_csv()读取具有以下标头且没有其他信息的.csv文件:

  

表格,原因,发起者,小组,影响

df_empty脚本如下:

def df_empty(columns, dtypes, index=None):
    assert len(columns)==len(dtypes)
    df = pd.DataFrame(index=index)
    for c,d in zip(columns, dtypes):
        df[c] = pd.Series(dtype=d)
    return df

# https://stackoverflow.com/a/48374031    
# Usage: df = df_empty(['a', 'b'], dtypes=[np.int64, np.int64])

我的脚本包含以下用于创建数据框的行:

resultData = df_empty(['Sheet','Cause','Initiator','Group','Effects'],[np.str,np.int64,np.str,np.str,np.str])

我也使用了以下内容,没有任何区别:

resultData = df_empty(['Sheet','Cause','Initiator','Group','Effects'],['object','int64','object','object','object'])

我整理数据并将其添加到数据框的脚本如下:

data = {'Sheet': sheetNum, 'Cause': causeNum, 'Initiator': initTag, 'Group': grp, 'Effects': effectStr}
count = len(resultData)
resultData.at[count,:] = data

运行display(data)时,我在Jupyter中得到以下信息:

{'Sheet': '0001',
 'Cause': 1,
 'Initiator': 'Tag_I1',
 'Group': 'DIG',
 'Effects': 'Tag_O1, Tag_O2,...'}

我想同时使用这两个选项/阅读csv时看到的内容:

+-------+-------+-----------+-------+--------------------+
| Sheet | Cause | Initiator | Group |      Effects       |
+-------+-------+-----------+-------+--------------------+
|  0001 |     1 | Tag_I1    | DIG   | Tag_O1, Tag_O2,... |
|  0001 |     2 | Tag_I2    | DIG   | Tag_O2, Tag_04,... |
+-------+-------+-----------+-------+--------------------+

使用df_empty生成数据帧时看到的内容:

+-------+-------+-----------+-------+--------------------+
| Sheet | Cause | Initiator | Group |      Effects       |
+-------+-------+-----------+-------+--------------------+
| Sheet | Cause | Initiator | Group | Effects            |
| 0001  | 2     | Tag_I2    | DIG   | Tag_O2, Tag_04,... |
+-------+-------+-----------+-------+--------------------+

关于可能导致生成的数据帧将标头复制到第一行以及是否有可能不必读取原本为空的csv的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:1)

为什么?因为您已将第一行作为数据插入。使用第一行作为标头的神奇行为是在read_csv()中,如果您在不使用read_csv的情况下创建数据框,则不会对第一行进行特殊处理。

解决方案?插入到df_empty生成的数据帧时,跳过第一行。