DataFrame是一个二维标签数据结构,可以有不同类型的列。 您可以将其视为电子表格或SQL表,或拥有Series对象的字典。 它通常是最常用的pandas对象。 与Series类似,DataFrame接受许多不同类型的输入:
注意
当数据是dict,并且未指定列时,如果您使用的是Python版本> = 3.6且Pandas> = 0.23,则DataFrame的列将按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通过访问index和columns属性,可以分别访问行和列标签:
注意
当一组特定的列与数据的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必须都是相同的长度。 如果传递索引,则它必须与数组的长度相同。 如果没有传递索引,则结果将是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那样工作。
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字典自动创建多索引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具有相同索引的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索引的长度相匹配。
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