用每行中不一致的数据构建熊猫数据框

时间:2018-10-26 13:09:49

标签: python pandas dataframe

我正在尝试从某些数据中构建一些数据帧,这些数据的内容(就变量而言,而不是值)可能会在同一数据帧的每一行中发生变化。

我现在尝试执行的方法是为每个新行构建一个新的1行数据框,然后使用append方法将其附加到现有数据框。这将负责创建新列,并将现有行的值设置为NaN。

我也按照建议的here尝试了loc方法,但这会返回ValueError。

除此之外,我可能有超过一千个可能的标签。因此,我想避免不得不在开始时显式声明所有列,并且几乎不需要知道整个文件就几乎不可能知道特定文件将需要哪些所有列。

但是,我知道逐行构建数据框被认为是一种不好的做法(如果不建议弃用)。

所以,可以说我的数据来自某个与此相似的文本文件:

A=10,B=2
A=20,B=3
A=30,C=Batman

我想创建一个看起来像

的数据框
    a    b       c
0  10  2.0     NaN
0  20  3.0     NaN
0  30  NaN  Batman

您会如何建议呢?

编辑: 数据来自非常混乱的固定宽度文本。文本文件的每一行都是连续的字符序列(无定界符)。该行内有3个字母的标识符,用于标记节的开头,然后是该节的值。我有一个文档,我将其翻译成python字典,该文档告诉我每个标识符在本节开始后需要读取多少个字符以及它们如何划分。

例如。一行可能是

AAA1234BBB789aa78CCC123456

然后我会知道AAA部分是3个值的跟随者,一个值由2位整数组成,而两个值由1位整数组成。该部分BBB后跟3位整数,2个字符字符串和2个一位整数。

我有一段代码将其转换为看起来像这样的字典

{'AAA_1': 12, 'AAA_2':3, 'AAA_3':4, 'BBB_1':789, 'BBB_2':aa,'BBB_3':7, 'BBB_4':8, ......}

EDIT2:如果您想看一看原始文件,可以在这里查看(其中任何一个都可以使用):

ftp://ftp.ncdc.noaa.gov/pub/data/noaa/2017/

要了解如何阅读,请看这里(不想问那么多):

ftp://ftp.ncdc.noaa.gov/pub/data/noaa/ish-format-document.pdf

3 个答案:

答案 0 :(得分:0)

您可以将每一行作为字典,然后将它们组合成一个数据框

import pandas as pd
import numpy as np


a = pd.DataFrame(np.random.randn(50, 5))
pd.rolling_apply(arg=a[0], 
                 func=lambda x: pd.ewma(x, span=10), 
                 window=10)

答案 1 :(得分:0)

看起来您的数据更适合存储为JSON。 如果您可以按照以下方式将数据转换为JSON:

data.json的内容:

[
   {"A":10, "B":2},
   {"A":20, "B":3},
   {"A":30, "C":"Batman"}
]

然后您可以简单地做到:

>>> df = pd.read_json('data.json')
>>> print(df)
    A    B       C
0  10  2.0     NaN
1  20  3.0     NaN
2  30  NaN  Batman

答案 2 :(得分:0)

假设数据以csv文件的形式出现。您可以像每个人一样阅读

>>> print data1
     a       b    c
0   10       2  5.0
1    0     NaN  8.0
2  NaN  batman  9.0
3  cat     NaN  NaN

>>> print data2
   a  b     d
0  0  0   123
1  0  0   fox
2  0  0   883
3  0  0  bats

data1 = pd.read_csv('file1.csv',header=0)
data2 = pd.read_csv('file2.csv'.header=0)

然后:joined = pd.contact([data1,data2], sort=True).reset_index(drop=True)

>>> print joined
     a       b    c     d
0   10       2  5.0   NaN
1    0     NaN  8.0   NaN
2  NaN  batman  9.0   NaN
3  cat     NaN  NaN   NaN
4    0       0  NaN   123
5    0       0  NaN   fox
6    0       0  NaN   883
7    0       0  NaN  bats