pandas中文文档
作者: 杨志勇
DataFrame

DataFrame是一个二维标签数据结构,可以有不同类型的列。 您可以将其视为电子表格或SQL表,或拥有Series对象的字典。 它通常是最常用的pandas对象。 与Series类似,DataFrame接受许多不同类型的输入:

  • 拥有一维 ndarray、list、dicts或Series的Dict
  • 二维numpy.ndarray
  • 结构化或记录 ndarray
  • 一个Series
  • 另一个DataFrame
除了数据,您还可以选择传递index(行标签)和columns(列标签)参数。 如果传递index/columns,则您需要自己确保DataFrame的index/columns。 因此,Series字典加上特定索引将丢弃与传递的索引不匹配的所有数据。
如果未传递轴标签,则将根据常识规则从输入数据构造它们。

注意

当数据是dict,并且未指定列时,如果您使用的是Python版本> = 3.6且Pandas> = 0.23,则DataFrame的列将按dict的插入顺序排序。
如果您使用的是Python <3.6或Pandas <0.23,并且未指定列,则DataFrame的列将按照dict键列表的字母顺序排序。

来自  Series 或者 dicts 的dict

结果索引将是各个Series的索引的并集。 如果有任何嵌套的dicts,将首先转换为Series。 如果没有传递columns,则columns将是dict键的有序列表。

In [34]: d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
   ....:      'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
   ....: 

In [35]: df = pd.DataFrame(d)

In [36]: df
Out[36]: 
   one  two
a  1.0  1.0
b  2.0  2.0
c  3.0  3.0
d  NaN  4.0

In [37]: pd.DataFrame(d, index=['d', 'b', 'a'])
Out[37]: 
   one  two
d  NaN  4.0
b  2.0  2.0
a  1.0  1.0

In [38]: pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three'])
Out[38]: 
   two three
d  4.0   NaN
b  2.0   NaN
a  1.0   NaN
通过访问indexcolumns属性,可以分别访问行和列标签:

注意

 当一组特定的列与数据的dict一起传递时,传递的列将覆盖dict中的键。
In [39]: df.index
Out[39]: Index(['a', 'b', 'c', 'd'], dtype='object')

In [40]: df.columns
Out[40]: Index(['one', 'two'], dtype='object')

来自元素为ndarrays / lists 的dict

ndarrays必须都是相同的长度。 如果传递索引,则它必须与数组的长度相同。 如果没有传递索引,则结果将是range(n),其中n是数组长度。

In [41]: d = {'one' : [1., 2., 3., 4.],
   ....:      'two' : [4., 3., 2., 1.]}
   ....: 

In [42]: pd.DataFrame(d)
Out[42]: 
   one  two
0  1.0  4.0
1  2.0  3.0
2  3.0  2.0
3  4.0  1.0

In [43]: pd.DataFrame(d, index=['a', 'b', 'c', 'd'])
Out[43]: 
   one  two
a  1.0  4.0
b  2.0  3.0
c  3.0  2.0
d  4.0  1.0

来自结构化或记录数组

这种情况的处理方式与数组的字典相同。

In [44]: data = np.zeros((2,), dtype=[('A', 'i4'),('B', 'f4'),('C', 'a10')])

In [45]: data[:] = [(1,2.,'Hello'), (2,3.,"World")]

In [46]: pd.DataFrame(data)
Out[46]: 
   A    B         C
0  1  2.0  b'Hello'
1  2  3.0  b'World'

In [47]: pd.DataFrame(data, index=['first', 'second'])
Out[47]: 
        A    B         C
first   1  2.0  b'Hello'
second  2  3.0  b'World'

In [48]: pd.DataFrame(data, columns=['C', 'A', 'B'])
Out[48]: 
          C  A    B
0  b'Hello'  1  2.0
1  b'World'  2  3.0

注意 DataFrame并不完全像二维NumPy ndarray那样工作。

来自dicts的列表

In [49]: data2 = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]

In [50]: pd.DataFrame(data2)
Out[50]: 
   a   b     c
0  1   2   NaN
1  5  10  20.0

In [51]: pd.DataFrame(data2, index=['first', 'second'])
Out[51]: 
        a   b     c
first   1   2   NaN
second  5  10  20.0

In [52]: pd.DataFrame(data2, columns=['a', 'b'])
Out[52]: 
   a   b
0  1   2
1  5  10

来自tuples的dict

您可以通过传递tuples字典自动创建多索引DataFrame。


In [53]: pd.DataFrame({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2},
   ....:               ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4},
   ....:               ('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6},
   ....:               ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8},
   ....:               ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}})
   ....: 
Out[53]: 
       a              b      
       b    a    c    a     b
A B  1.0  4.0  5.0  8.0  10.0
  C  2.0  3.0  6.0  7.0   NaN
  D  NaN  NaN  NaN  NaN   9.0

来自 Series

结果将是一个与输入Series具有相同索引的DataFrame,以及一个列,其名称是Series的原始名称(仅当没有提供其他列名时)。
缺失数据
在“缺失数据”部分中将对这个主题进行更多说明。 要构造具有缺失数据的DataFrame,我们使用np.nan来表示缺失值。 或者,您可以将numpy.MaskedArray作为数据参数传递给DataFrame构造函数,并且其掩码条目将被视为缺失。

替代的构造函数

DataFrame.from_dict

DataFrame.from_dict接受dicts的dict或类似数组的序列的dict并返回DataFrame。 它的操作类似于DataFrame构造函数,除了orient参数,默认情况下为'columns',但可以将其设置为'index',以便将dict键用作行标签。

In [54]: pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]))
Out[54]: 
   A  B
0  1  4
1  2  5
2  3  6
如果您传递orient ='index',则键将是行标签。 在这种情况下,您还可以传递所需的列名称:
In [55]: pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]),
   ....:                        orient='index', columns=['one', 'two', 'three'])
   ....: 
Out[55]: 
   one  two  three
A    1    2      3
B    4    5      6

DataFrame.from_records

DataFrame.from_records采用元组列表或带有结构化dtype的ndarray作为参数。 它类似于普通的DataFrame构造函数,但生成的DataFrame索引可能是结构化dtype的某个字段。 例如:


In [56]: data
Out[56]: 
array([(1,  2., b'Hello'), (2,  3., b'World')],
      dtype=[('A', '<i4'), ('B', '<f4'), ('C', 'S10')])

In [57]: pd.DataFrame.from_records(data, index='C')
Out[57]: 
          A    B
C               
b'Hello'  1  2.0
b'World'  2  3.0

列选择、新增、删除

您可以在语义上将DataFrame视为类似具有索引的Series对象的dict。 获取、设置和删除列的工作方式与类似的dict操作相同:

In [58]: df['one']
Out[58]: 
a    1.0
b    2.0
c    3.0
d    NaN
Name: one, dtype: float64

In [59]: df['three'] = df['one'] * df['two']

In [60]: df['flag'] = df['one'] > 2

In [61]: df
Out[61]: 
   one  two  three   flag
a  1.0  1.0    1.0  False
b  2.0  2.0    4.0  False
c  3.0  3.0    9.0   True
d  NaN  4.0    NaN  False
列可以像dict一样删除或弹出:
In [62]: del df['two']

In [63]: three = df.pop('three')

In [64]: df
Out[64]: 
   one   flag
a  1.0  False
b  2.0  False
c  3.0   True
d  NaN  False
插入标量值时,它会自然地传播以填充列:
In [65]: df['foo'] = 'bar'

In [66]: df
Out[66]: 
   one   flag  foo
a  1.0  False  bar
b  2.0  False  bar
c  3.0   True  bar
d  NaN  False  bar
插入与DataFrame不具有相同索引的Series时,它将符合DataFrame的索引:
In [67]: df['one_trunc'] = df['one'][:2]

In [68]: df
Out[68]: 
   one   flag  foo  one_trunc
a  1.0  False  bar        1.0
b  2.0  False  bar        2.0
c  3.0   True  bar        NaN
d  NaN  False  bar        NaN
您可以插入原始ndarrays,但它们的长度必须与DataFrame索引的长度相匹配。
默认情况下,列会在末尾插入。 insert函数可用于插入列中的特定位置:
In [69]: df.insert(1, 'bar', df['one'])

In [70]: df
Out[70]: 
   one  bar   flag  foo  one_trunc
a  1.0  1.0  False  bar        1.0
b  2.0  2.0  False  bar        2.0
c  3.0  3.0   True  bar        NaN
d  NaN  NaN  False  bar        NaN



















标签: dataframe、nan、dict、df、2.0
一个创业中的苦逼程序员
  • 回复
隐藏