选择 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 还使用 lociloc 索引器。 借助 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 约定的模式,但它们在实践中却非常有用。