选择 DataFrames 对象中的数据
DataFrames 还展示了双重行为,既像一个二维 ndarray,又像一个共享同一索引的 Series 字典。
DataFrame 用作 Series 的字典
让我们回到前面关于国家/地区和人口的示例,将 DataFrames 作为 Series 的字典进行检查。
area = pd.Series({'Albania': 28748,
'France': 643801,
'Germany': 357386,
'Japan': 377972,
'Russia': 17125200})
population = pd.Series ({'Albania': 2937590,
'France': 65429495,
'Germany': 82408706,
'Russia': 143910127,
'Japan': 126922333})
countries = pd.DataFrame({'Area': area, 'Population': population})
countries
输出为:
| | Area | Population |
------------------------------------
| Albania | 28748 | 2937590 |
| France | 643801 | 65429495 |
| Germany | 357386 | 82408706 |
| Japan | 377972 | 126922333 |
| Russia | 17125200 | 143910127 |
可通过列名称的字典式索引来访问组成 Series 列的单个 DataFrame:
countries['Area']
输出为:
Albania 28748
France 643801
Germany 357386
Japan 377972
Russia 17125200
Name: Area, dtype: int64
可使用字典式语法来修改 DataFrames,例如通过添加新列进行修改:
countries['Population Density'] = countries['Population'] / countries['Area']
countries
输出为:
| | Area | Population | Population density |
------------------------------------------------------------
| Albania | 28748 | 2937590 | 102.184152 |
| France | 643801 | 65429495.0 | 101.629999 |
| Germany | 357386 | 82408706.0 | 230.587393 |
| Japan | 377972 | 126922333.0 | 335.798242 |
| Russia | 17125200 | 143910127.0 | 8.403413 |
DataFrame 用作二维数组
还可将 DataFrames 视为二维数组。 可使用 DataFrame 特性来检查 values 或数据数组中的原始数据:
countries.values
输出为:
array([[2.87480000e+04, 2.93759000e+06, 1.02184152e+02],
[6.43801000e+05, 6.54294950e+07, 1.01629999e+02],
[3.57386000e+05, 8.24087060e+07, 2.30587393e+02],
[3.77972000e+05, 1.26922333e+08, 3.35798242e+02],
[1.71252000e+07, 1.43910127e+08, 8.40341292e+00]])
这样看来,转置 DataFrame 的行和列很有用,这与使用数组的方式相同:
countries.T
输出为:
| | Albania | France | Germany | Japan | Russia |
-------------------------------------------------------------------------------------------------------
| Area | 2.874800e+04 | 6.438010e+05 | 3.573860e+05 | 3.779720e+05 | 1.712520e+07 |
| Population | 2.937590e+06 | 6.542950e+07 | 8.240871e+07 | 1.269223e+08 | 1.439101e+08 |
| Population density | 1.021842e+02 | 1.016300e+02 | 2.305874e+02 | 3.357982e+02 | 8.403413e+00 |
DataFrames 还使用 loc 和 iloc 索引器。 借助 iloc,可将基础数组作为 ndarray 进行索引,但会在结果中保留 DataFrame 索引和列标签:
countries.iloc[:3, :2]
输出为:
| | Area | Population |
------------------------------------
| Albania | 28748 | 2937590 |
| France | 643801 | 65429495 |
| Germany | 357386 | 82408706 |
loc 还允许类似数组的切片,但它使用显式索引和列名:
countries.loc[:'Germany', :'Population']
输出为:
| | Area | Population |
------------------------------------
| Albania | 28748 | 2937590 |
| France | 643801 | 65429495 |
| Germany | 357386 | 82408706 |
还可将类似数组的技术(如掩码和花式索引)与 loc 结合使用。
亲自试一试
你能想到如何在一行中同时使用掩码和花式索引吗?
- 掩码可能类似于
countries['Population density'] > 200。 - 花式索引可能类似于
['Population', 'Population density']。
请确保将掩码和花式索引置于方括号内:countries.loc[]。
提示 (展开以显示)
countries.loc[countries['Population density'] > 200, ('Population', 'Population density')]
| | Population | Population density |
---------------------------------------------
| Germany | 82408706 | 230.587393 |
| Japan | 126922333 | 335.798242 |
索引约定
在数据科学中(更常见的是在 Pandas 中),索引是指切片引用行时对应的列。
countries['France':'Japan']
输出为:
| | Area | Population | Population density |
------------------------------------------------------------
| France | 643801 | 65429495.0 | 101.629999 |
| Germany | 357386 | 82408706.0 | 230.587393 |
| Japan | 377972 | 126922333.0 | 335.798242 |
此类切片还可按数字而非索引来引用行:
countries[1:3]
输出为:
| | Area | Population | Population density |
------------------------------------------------------------
| France | 643801 | 65429495.0 | 101.629999 |
| Germany | 357386 | 82408706.0 | 230.587393 |
同样地,直接掩码操作也会按行而非按列进行解释:
countries[countries['Population density'] > 200]
输出为:
| | Area | Population | Population density |
------------------------------------------------------------
| Germany | 357386 | 82408706.0 | 230.587393 |
| Japan | 377972 | 126922333.0 | 335.798242 |
这两种约定在语法上类似于 NumPy 数组中的约定。 尽管这些约定可能不完全符合 Pandas 约定的模式,但它们在实践中却非常有用。