与电子表格的比较#

由于许多潜在的Pandas用户对电子表格程序有一定的了解,比如 Excel ,本页面旨在提供一些示例,说明如何使用Pandas执行各种电子表格操作。本页将使用术语和指向Excel文档的链接,但中的大部分内容将相同/相似 Google SheetsLibreOffice CalcApple Numbers ,以及其他与Excel兼容的电子表格软件。

如果你是Pandas的新手,你可能想先通读一下 10 Minutes to pandas 让你自己熟悉类库。

按照惯例,我们进口Pandas和NumPy如下:

In [1]: import pandas as pd

In [2]: import numpy as np

数据结构#

通用术语翻译#

Pandas

Excel

DataFrame

工作表

Series

立柱

Index

行标题

NaN

空单元格

DataFrame#

A DataFrame 在Pandas中类似于Excel工作表。虽然一个Excel工作簿可以包含多个工作表,但Pandas DataFrame s独立存在。

Series#

A Series 是表示 DataFrame 。使用 Series 类似于引用电子表格的一列。

Index#

每个 DataFrameSeries vbl.有一个 Index ,它们是位于 rows 数据的一部分。在Pandas中,如果未指定索引,则使用 RangeIndex 默认情况下使用(第一行=0,第二行=1,依此类推),类似于电子表格中的行标题/数字。

在PANDA中,可以将索引设置为一个(或多个)唯一值,这就像拥有一列用作工作表中的行标识符一样。与大多数电子表格不同,这些 Index 值实际上可以用来引用行。(请注意 this can be done in Excel with structured references 。)例如,在电子表格中,可以将第一行引用为 A1:Z1 ,而在Pandas身上,你可以使用 populations.loc['Chicago']

索引值也是持久的,因此如果您对 DataFrame ,则特定行的标签不会更改。

请参阅 indexing documentation 有关如何使用 Index 有效地。

复印件与就地操作#

大多数大Pandas的操作都会返回 Series/DataFrame 。要使更改“生效”,您需要为一个新变量赋值:

sorted_df = df.sort_values("col1")

或覆盖原始文件:

df = df.sort_values("col1")

备注

您将看到一个 inplace=True 某些方法可用的关键字参数:

df.sort_values("col1", inplace=True)

它的使用是不鼓励的。 More information.

数据输入/输出#

从值构造DataFrame#

在电子表格中, values can be typed directly into cells

一只Pandas DataFrame 可以用许多不同的方式构造,但对于少量的值,通常可以将其指定为一个Python字典,其中键是列名,值是数据。

In [3]: df = pd.DataFrame({"x": [1, 3, 5], "y": [2, 4, 6]})

In [4]: df
Out[4]: 
   x  y
0  1  2
1  3  4
2  5  6

正在读取外部数据#

两者都有 Excelpandas 可以从各种来源以各种格式导入数据。

CSV#

让我们加载并显示 tips 来自Pandas测试的数据集,这是一个CSV文件。在Excel中,您可以下载,然后 open the CSV 。在Pandas中,您将CSV文件的URL或本地路径传递给 read_csv()

In [5]: url = (
   ...:     "https://raw.github.com/pandas-dev"
   ...:     "/pandas/main/pandas/tests/io/data/csv/tips.csv"
   ...: )
   ...: 

In [6]: tips = pd.read_csv(url)

In [7]: tips
Out[7]: 
     total_bill   tip     sex smoker   day    time  size
0         16.99  1.01  Female     No   Sun  Dinner     2
1         10.34  1.66    Male     No   Sun  Dinner     3
2         21.01  3.50    Male     No   Sun  Dinner     3
3         23.68  3.31    Male     No   Sun  Dinner     2
4         24.59  3.61  Female     No   Sun  Dinner     4
..          ...   ...     ...    ...   ...     ...   ...
239       29.03  5.92    Male     No   Sat  Dinner     3
240       27.18  2.00  Female    Yes   Sat  Dinner     2
241       22.67  2.00    Male    Yes   Sat  Dinner     2
242       17.82  1.75    Male     No   Sat  Dinner     2
243       18.78  3.00  Female     No  Thur  Dinner     2

[244 rows x 7 columns]

喜欢 Excel's Text Import Wizardread_csv 可以采用多个参数来指定应如何分析数据。例如,如果数据改用制表符分隔,并且没有列名,则PANDAS命令将为:

tips = pd.read_csv("tips.csv", sep="\t", header=None)

# alternatively, read_table is an alias to read_csv with tab delimiter
tips = pd.read_table("tips.csv", header=None)

Excel文件#

Excel打开 various Excel file formats 通过双击它们,或使用 the Open menu 。在Pandas身上,你可以使用 special methods for reading and writing from/to Excel files

我们先来吧 create a new Excel file 基于 tips 上例中的数据帧:

tips.to_excel("./tips.xlsx")

如果您希望随后访问 tips.xlsx 文件,您可以使用以下命令将其读取到模块中

tips_df = pd.read_excel("./tips.xlsx", index_col=0)

您刚刚使用PANAS读入了一个Excel文件!

限制产量#

电子表格程序一次只显示一屏数据,然后允许滚动,因此实际上没有必要限制输出。在Pandas身上,你需要多花点心思来控制你的 DataFrame 将显示。

默认情况下,Pandas将截断大型 DataFrame 以显示第一行和最后一行。这可以通过以下方式覆盖 changing the pandas options ,或使用 DataFrame.head()DataFrame.tail()

In [8]: tips.head(5)
Out[8]: 
   total_bill   tip     sex smoker  day    time  size
0       16.99  1.01  Female     No  Sun  Dinner     2
1       10.34  1.66    Male     No  Sun  Dinner     3
2       21.01  3.50    Male     No  Sun  Dinner     3
3       23.68  3.31    Male     No  Sun  Dinner     2
4       24.59  3.61  Female     No  Sun  Dinner     4

正在导出数据#

默认情况下,桌面电子表格软件将保存为其各自的文件格式 (.xlsx.ods 等)。然而,你可以, save to other file formats

pandas can create Excel filesCSV ,或 a number of other formats

数据操作#

列上的操作#

在电子表格中, formulas 通常在单个单元格中创建,然后 dragged 到其他单元格中,以便为其他列计算它们。在Pandas身上,你可以直接对整根柱子进行操作。

Pandas通过指定个体来提供矢量化操作 SeriesDataFrame 。可以用相同的方式分配新列。这个 DataFrame.drop() 方法将一列从 DataFrame

In [9]: tips["total_bill"] = tips["total_bill"] - 2

In [10]: tips["new_bill"] = tips["total_bill"] / 2

In [11]: tips
Out[11]: 
     total_bill   tip     sex smoker   day    time  size  new_bill
0         14.99  1.01  Female     No   Sun  Dinner     2     7.495
1          8.34  1.66    Male     No   Sun  Dinner     3     4.170
2         19.01  3.50    Male     No   Sun  Dinner     3     9.505
3         21.68  3.31    Male     No   Sun  Dinner     2    10.840
4         22.59  3.61  Female     No   Sun  Dinner     4    11.295
..          ...   ...     ...    ...   ...     ...   ...       ...
239       27.03  5.92    Male     No   Sat  Dinner     3    13.515
240       25.18  2.00  Female    Yes   Sat  Dinner     2    12.590
241       20.67  2.00    Male    Yes   Sat  Dinner     2    10.335
242       15.82  1.75    Male     No   Sat  Dinner     2     7.910
243       16.78  3.00  Female     No  Thur  Dinner     2     8.390

[244 rows x 8 columns]

In [12]: tips = tips.drop("new_bill", axis=1)

请注意,我们不必告诉它去做减法-Pandas一个细胞一个细胞地为我们处理这一点。看见 how to create new columns derived from existing columns

过滤#

In Excel, filtering is done through a graphical menu.

显示将TOTAL_BILL列过滤为大于10的值的屏幕截图

可以通过多种方式过滤DataFrame;其中最直观的是使用 boolean indexing

In [13]: tips[tips["total_bill"] > 10]
Out[13]: 
     total_bill   tip     sex smoker   day    time  size
0         14.99  1.01  Female     No   Sun  Dinner     2
2         19.01  3.50    Male     No   Sun  Dinner     3
3         21.68  3.31    Male     No   Sun  Dinner     2
4         22.59  3.61  Female     No   Sun  Dinner     4
5         23.29  4.71    Male     No   Sun  Dinner     4
..          ...   ...     ...    ...   ...     ...   ...
239       27.03  5.92    Male     No   Sat  Dinner     3
240       25.18  2.00  Female    Yes   Sat  Dinner     2
241       20.67  2.00    Male    Yes   Sat  Dinner     2
242       15.82  1.75    Male     No   Sat  Dinner     2
243       16.78  3.00  Female     No  Thur  Dinner     2

[204 rows x 7 columns]

上面的语句只是将一个 Series of True/False 对象绑定到DataFrame,并使用 True

In [14]: is_dinner = tips["time"] == "Dinner"

In [15]: is_dinner
Out[15]: 
0      True
1      True
2      True
3      True
4      True
       ... 
239    True
240    True
241    True
242    True
243    True
Name: time, Length: 244, dtype: bool

In [16]: is_dinner.value_counts()
Out[16]: 
True     176
False     68
Name: time, dtype: int64

In [17]: tips[is_dinner]
Out[17]: 
     total_bill   tip     sex smoker   day    time  size
0         14.99  1.01  Female     No   Sun  Dinner     2
1          8.34  1.66    Male     No   Sun  Dinner     3
2         19.01  3.50    Male     No   Sun  Dinner     3
3         21.68  3.31    Male     No   Sun  Dinner     2
4         22.59  3.61  Female     No   Sun  Dinner     4
..          ...   ...     ...    ...   ...     ...   ...
239       27.03  5.92    Male     No   Sat  Dinner     3
240       25.18  2.00  Female    Yes   Sat  Dinner     2
241       20.67  2.00    Male    Yes   Sat  Dinner     2
242       15.82  1.75    Male     No   Sat  Dinner     2
243       16.78  3.00  Female     No  Thur  Dinner     2

[176 rows x 7 columns]

IF/THEN逻辑#

比方说我们想要做一个 bucket 值为的列 lowhigh ,根据是否 total_bill 少于或超过10美元。

在电子表格中,可以用以下方式进行逻辑比较 conditional formulas 。我们会用一个公式 =IF(A2 < 10, "low", "high") ,拖到新的 bucket 列。

屏幕截图,在TIPS电子表格的存储桶列中显示了上面的公式

在Pandas身上也可以使用 where 方法来自 numpy

In [18]: tips["bucket"] = np.where(tips["total_bill"] < 10, "low", "high")

In [19]: tips
Out[19]: 
     total_bill   tip     sex smoker   day    time  size bucket
0         14.99  1.01  Female     No   Sun  Dinner     2   high
1          8.34  1.66    Male     No   Sun  Dinner     3    low
2         19.01  3.50    Male     No   Sun  Dinner     3   high
3         21.68  3.31    Male     No   Sun  Dinner     2   high
4         22.59  3.61  Female     No   Sun  Dinner     4   high
..          ...   ...     ...    ...   ...     ...   ...    ...
239       27.03  5.92    Male     No   Sat  Dinner     3   high
240       25.18  2.00  Female    Yes   Sat  Dinner     2   high
241       20.67  2.00    Male    Yes   Sat  Dinner     2   high
242       15.82  1.75    Male     No   Sat  Dinner     2   high
243       16.78  3.00  Female     No  Thur  Dinner     2   high

[244 rows x 8 columns]

日期功能#

本节将引用“日期”,但时间戳的处理方式类似。

我们可以将日期功能分为两个部分:解析和输出。在电子表格中,日期值通常是自动分析的,尽管有 DATEVALUE 功能(如果需要)。在Pandas中,您需要显式地将纯文本转换为DateTime对象 while reading from a CSVonce in a DataFrame

不过,经过解析后,电子表格会以默认格式显示日期 the format can be changed 。在Pandas中,你通常会想要把日期保持为 datetime 当你用它们进行计算的时候。输出 零件 的日期(如年份)是通过 date functions 在电子表格中,以及 datetime properties 在Pandas身上。

给定的 date1date2 在专栏中 AB 对于电子表格,您可能会有以下公式:

立柱

公式式

date1_year

=YEAR(A2)

date2_month

=MONTH(B2)

date1_next

=DATE(YEAR(A2),MONTH(A2)+1,1)

months_between

=DATEDIF(A2,B2,"M")

等同的大Pandas手术如下所示。

In [20]: tips["date1"] = pd.Timestamp("2013-01-15")

In [21]: tips["date2"] = pd.Timestamp("2015-02-15")

In [22]: tips["date1_year"] = tips["date1"].dt.year

In [23]: tips["date2_month"] = tips["date2"].dt.month

In [24]: tips["date1_next"] = tips["date1"] + pd.offsets.MonthBegin()

In [25]: tips["months_between"] = tips["date2"].dt.to_period("M") - tips[
   ....:     "date1"
   ....: ].dt.to_period("M")
   ....: 

In [26]: tips[
   ....:     ["date1", "date2", "date1_year", "date2_month", "date1_next", "months_between"]
   ....: ]
   ....: 
Out[26]: 
         date1      date2  date1_year  date2_month date1_next    months_between
0   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
1   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
2   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
3   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
4   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
..         ...        ...         ...          ...        ...               ...
239 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
240 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
241 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
242 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
243 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>

[244 rows x 6 columns]

看见 时间序列/日期功能 了解更多详细信息。

柱子的选择#

在电子表格中,您可以通过以下方式选择所需的列:

因为电子表格列通常是 named in a header row ,重命名列只需更改第一个单元格中的文本即可。

同样的操作在下面的Pandas中表达。

保留某些列#

In [27]: tips[["sex", "total_bill", "tip"]]
Out[27]: 
        sex  total_bill   tip
0    Female       14.99  1.01
1      Male        8.34  1.66
2      Male       19.01  3.50
3      Male       21.68  3.31
4    Female       22.59  3.61
..      ...         ...   ...
239    Male       27.03  5.92
240  Female       25.18  2.00
241    Male       20.67  2.00
242    Male       15.82  1.75
243  Female       16.78  3.00

[244 rows x 3 columns]

删除一列#

In [28]: tips.drop("sex", axis=1)
Out[28]: 
     total_bill   tip smoker   day    time  size
0         14.99  1.01     No   Sun  Dinner     2
1          8.34  1.66     No   Sun  Dinner     3
2         19.01  3.50     No   Sun  Dinner     3
3         21.68  3.31     No   Sun  Dinner     2
4         22.59  3.61     No   Sun  Dinner     4
..          ...   ...    ...   ...     ...   ...
239       27.03  5.92     No   Sat  Dinner     3
240       25.18  2.00    Yes   Sat  Dinner     2
241       20.67  2.00    Yes   Sat  Dinner     2
242       15.82  1.75     No   Sat  Dinner     2
243       16.78  3.00     No  Thur  Dinner     2

[244 rows x 6 columns]

重命名列#

In [29]: tips.rename(columns={"total_bill": "total_bill_2"})
Out[29]: 
     total_bill_2   tip     sex smoker   day    time  size
0           14.99  1.01  Female     No   Sun  Dinner     2
1            8.34  1.66    Male     No   Sun  Dinner     3
2           19.01  3.50    Male     No   Sun  Dinner     3
3           21.68  3.31    Male     No   Sun  Dinner     2
4           22.59  3.61  Female     No   Sun  Dinner     4
..            ...   ...     ...    ...   ...     ...   ...
239         27.03  5.92    Male     No   Sat  Dinner     3
240         25.18  2.00  Female    Yes   Sat  Dinner     2
241         20.67  2.00    Male    Yes   Sat  Dinner     2
242         15.82  1.75    Male     No   Sat  Dinner     2
243         16.78  3.00  Female     No  Thur  Dinner     2

[244 rows x 7 columns]

按值排序#

电子表格中的排序通过以下方式完成 the sort dialog

来自Excel的对话框屏幕截图,显示按性别排序,然后是TOTAL_BILL列

Pandas有一种 DataFrame.sort_values() 方法,该方法接受要排序的列的列表。

In [30]: tips = tips.sort_values(["sex", "total_bill"])

In [31]: tips
Out[31]: 
     total_bill    tip     sex smoker   day    time  size
67         1.07   1.00  Female    Yes   Sat  Dinner     1
92         3.75   1.00  Female    Yes   Fri  Dinner     2
111        5.25   1.00  Female     No   Sat  Dinner     1
145        6.35   1.50  Female     No  Thur   Lunch     2
135        6.51   1.25  Female     No  Thur   Lunch     2
..          ...    ...     ...    ...   ...     ...   ...
182       43.35   3.50    Male    Yes   Sun  Dinner     3
156       46.17   5.00    Male     No   Sun  Dinner     6
59        46.27   6.73    Male     No   Sat  Dinner     4
212       46.33   9.00    Male     No   Sat  Dinner     4
170       48.81  10.00    Male    Yes   Sat  Dinner     3

[244 rows x 7 columns]

字符串处理#

查找字符串的长度#

在电子表格中,文本中的字符数可以通过 LEN 功能。它可以与 TRIM 函数删除多余的空格。

=LEN(TRIM(A2))

您可以使用以下命令来计算字符串的长度 Series.str.len() 。在Python3中,所有字符串都是Unicode字符串。 len 包括尾随空格。使用 lenrstrip 以排除尾随空格。

In [32]: tips["time"].str.len()
Out[32]: 
67     6
92     6
111    6
145    5
135    5
      ..
182    6
156    6
59     6
212    6
170    6
Name: time, Length: 244, dtype: int64

In [33]: tips["time"].str.rstrip().str.len()
Out[33]: 
67     6
92     6
111    6
145    5
135    5
      ..
182    6
156    6
59     6
212    6
170    6
Name: time, Length: 244, dtype: int64

注意,这仍然会在字符串中包含多个空格,因此不是100%等价的。

查找子串的位置#

这个 FIND 电子表格函数返回子字符串的位置,第一个字符为 1

在Excel中使用查找公式的屏幕截图

属性可以找到字符在字符串列中的位置 Series.str.find() 方法。 find 搜索子字符串的第一个位置。如果找到子字符串,则该方法返回其位置。如果未找到,则返回 -1 。请记住,Python索引是从零开始的。

In [34]: tips["sex"].str.find("ale")
Out[34]: 
67     3
92     3
111    3
145    3
135    3
      ..
182    1
156    1
59     1
212    1
170    1
Name: sex, Length: 244, dtype: int64

按位置提取子串#

电子表格有一个 MID 从给定位置提取子字符串的公式。要获取第一个字符::

=MID(A2,1,1)

对于Pandas,你可以使用 [] 按位置从字符串中提取子字符串的表示法。请记住,Python索引是从零开始的。

In [35]: tips["sex"].str[0:1]
Out[35]: 
67     F
92     F
111    F
145    F
135    F
      ..
182    M
156    M
59     M
212    M
170    M
Name: sex, Length: 244, dtype: object

提取第n个单词#

在Excel中,您可以使用 Text to Columns Wizard 用于拆分文本和检索特定列。(注: it's possible to do so through a formula as well 。)

在Pandas中提取单词的最简单方法是用空格分割字符串,然后按索引引用单词。请注意,如果您需要的话,还有更强大的方法。

In [36]: firstlast = pd.DataFrame({"String": ["John Smith", "Jane Cook"]})

In [37]: firstlast["First_Name"] = firstlast["String"].str.split(" ", expand=True)[0]

In [38]: firstlast["Last_Name"] = firstlast["String"].str.rsplit(" ", expand=True)[1]

In [39]: firstlast
Out[39]: 
       String First_Name Last_Name
0  John Smith       John     Smith
1   Jane Cook       Jane      Cook

更改大小写#

电子表格提供 UPPER, LOWER, and PROPER functions 用于将文本分别转换为大写、小写和标题大小写。

等同的Pandas方法是 Series.str.upper()Series.str.lower() ,以及 Series.str.title()

In [40]: firstlast = pd.DataFrame({"string": ["John Smith", "Jane Cook"]})

In [41]: firstlast["upper"] = firstlast["string"].str.upper()

In [42]: firstlast["lower"] = firstlast["string"].str.lower()

In [43]: firstlast["title"] = firstlast["string"].str.title()

In [44]: firstlast
Out[44]: 
       string       upper       lower       title
0  John Smith  JOHN SMITH  john smith  John Smith
1   Jane Cook   JANE COOK   jane cook   Jane Cook

合并中#

合并示例中将使用以下表格:

In [45]: df1 = pd.DataFrame({"key": ["A", "B", "C", "D"], "value": np.random.randn(4)})

In [46]: df1
Out[46]: 
  key     value
0   A  0.469112
1   B -0.282863
2   C -1.509059
3   D -1.135632

In [47]: df2 = pd.DataFrame({"key": ["B", "D", "D", "E"], "value": np.random.randn(4)})

In [48]: df2
Out[48]: 
  key     value
0   B  1.212112
1   D -0.173215
2   D  0.119209
3   E -1.044236

在Excel中,有 merging of tables can be done through a VLOOKUP

屏幕截图显示了Excel中两个表之间的VLOOKUP公式,其中一些值被填写,另一些值使用“#N/A”

Pandas的DataFrame有一个 merge() 方法,该方法提供类似的功能。数据不必提前排序,不同的连接类型通过 how 关键字。

In [49]: inner_join = df1.merge(df2, on=["key"], how="inner")

In [50]: inner_join
Out[50]: 
  key   value_x   value_y
0   B -0.282863  1.212112
1   D -1.135632 -0.173215
2   D -1.135632  0.119209

In [51]: left_join = df1.merge(df2, on=["key"], how="left")

In [52]: left_join
Out[52]: 
  key   value_x   value_y
0   A  0.469112       NaN
1   B -0.282863  1.212112
2   C -1.509059       NaN
3   D -1.135632 -0.173215
4   D -1.135632  0.119209

In [53]: right_join = df1.merge(df2, on=["key"], how="right")

In [54]: right_join
Out[54]: 
  key   value_x   value_y
0   B -0.282863  1.212112
1   D -1.135632 -0.173215
2   D -1.135632  0.119209
3   E       NaN -1.044236

In [55]: outer_join = df1.merge(df2, on=["key"], how="outer")

In [56]: outer_join
Out[56]: 
  key   value_x   value_y
0   A  0.469112       NaN
1   B -0.282863  1.212112
2   C -1.509059       NaN
3   D -1.135632 -0.173215
4   D -1.135632  0.119209
5   E       NaN -1.044236

merge 有许多优势超过 VLOOKUP

  • 查找值不需要是查找表的第一列

  • 如果匹配了多行,则每个匹配都有一行,而不是只有第一行

  • 它将包括查找表中的所有列,而不仅仅是指定的单个列

  • 它支持 more complex join operations

其他考虑事项#

填充手柄#

在某一组单元格中创建一系列遵循设定模式的数字。在电子表格中,这可以通过在输入第一个数字后按住Shift键并拖动,或通过输入前两个或前三个值然后拖动来完成。

这可以通过创建一个序列并将其分配给所需的单元格来实现。

In [57]: df = pd.DataFrame({"AAA": [1] * 8, "BBB": list(range(0, 8))})

In [58]: df
Out[58]: 
   AAA  BBB
0    1    0
1    1    1
2    1    2
3    1    3
4    1    4
5    1    5
6    1    6
7    1    7

In [59]: series = list(range(1, 5))

In [60]: series
Out[60]: [1, 2, 3, 4]

In [61]: df.loc[2:5, "AAA"] = series

In [62]: df
Out[62]: 
   AAA  BBB
0    1    0
1    1    1
2    1    2
3    2    3
4    3    4
5    4    5
6    1    6
7    1    7

删除重复项#

Excel具有内置的以下功能 removing duplicate values 。这在Pandas身上得到了支持,通过 drop_duplicates()

In [63]: df = pd.DataFrame(
   ....:     {
   ....:         "class": ["A", "A", "A", "B", "C", "D"],
   ....:         "student_count": [42, 35, 42, 50, 47, 45],
   ....:         "all_pass": ["Yes", "Yes", "Yes", "No", "No", "Yes"],
   ....:     }
   ....: )
   ....: 

In [64]: df.drop_duplicates()
Out[64]: 
  class  student_count all_pass
0     A             42      Yes
1     A             35      Yes
3     B             50       No
4     C             47       No
5     D             45      Yes

In [65]: df.drop_duplicates(["class", "student_count"])
Out[65]: 
  class  student_count all_pass
0     A             42      Yes
1     A             35      Yes
3     B             50       No
4     C             47       No
5     D             45      Yes

数据透视表#

PivotTables 来自电子表格的数据可以通过以下方式在Pandas中复制 重塑和透视表 。使用 tips 数据集,让我们根据派对的规模和服务员的性别来计算平均小费。

在Excel中,我们对数据透视表使用以下配置:

在Excel中显示数据透视表的屏幕截图,使用性别作为列,大小作为行,然后使用平均小费作为值

在大Pandas身上相当于:

In [66]: pd.pivot_table(
   ....:     tips, values="tip", index=["size"], columns=["sex"], aggfunc=np.average
   ....: )
   ....: 
Out[66]: 
sex     Female      Male
size                    
1     1.276667  1.920000
2     2.528448  2.614184
3     3.250000  3.476667
4     4.021111  4.172143
5     5.140000  3.750000
6     4.600000  5.850000

添加行#

假设我们使用的是 RangeIndex (编号 01 等),我们可以使用 concat() 若要向 DataFrame

In [67]: df
Out[67]: 
  class  student_count all_pass
0     A             42      Yes
1     A             35      Yes
2     A             42      Yes
3     B             50       No
4     C             47       No
5     D             45      Yes

In [68]: new_row = pd.DataFrame([["E", 51, True]],
   ....:                        columns=["class", "student_count", "all_pass"])
   ....: 

In [69]: pd.concat([df, new_row])
Out[69]: 
  class  student_count all_pass
0     A             42      Yes
1     A             35      Yes
2     A             42      Yes
3     B             50       No
4     C             47       No
5     D             45      Yes
0     E             51     True

查找和替换#

Excel's Find dialog 把你带到匹配的细胞,一个接一个。在Pandas中,这一操作通常是针对整个柱子或 DataFrame 一口气通过 conditional expressions

In [70]: tips
Out[70]: 
     total_bill    tip     sex smoker   day    time  size
67         1.07   1.00  Female    Yes   Sat  Dinner     1
92         3.75   1.00  Female    Yes   Fri  Dinner     2
111        5.25   1.00  Female     No   Sat  Dinner     1
145        6.35   1.50  Female     No  Thur   Lunch     2
135        6.51   1.25  Female     No  Thur   Lunch     2
..          ...    ...     ...    ...   ...     ...   ...
182       43.35   3.50    Male    Yes   Sun  Dinner     3
156       46.17   5.00    Male     No   Sun  Dinner     6
59        46.27   6.73    Male     No   Sat  Dinner     4
212       46.33   9.00    Male     No   Sat  Dinner     4
170       48.81  10.00    Male    Yes   Sat  Dinner     3

[244 rows x 7 columns]

In [71]: tips == "Sun"
Out[71]: 
     total_bill    tip    sex  smoker    day   time   size
67        False  False  False   False  False  False  False
92        False  False  False   False  False  False  False
111       False  False  False   False  False  False  False
145       False  False  False   False  False  False  False
135       False  False  False   False  False  False  False
..          ...    ...    ...     ...    ...    ...    ...
182       False  False  False   False   True  False  False
156       False  False  False   False   True  False  False
59        False  False  False   False  False  False  False
212       False  False  False   False  False  False  False
170       False  False  False   False  False  False  False

[244 rows x 7 columns]

In [72]: tips["day"].str.contains("S")
Out[72]: 
67      True
92     False
111     True
145    False
135    False
       ...  
182     True
156     True
59      True
212     True
170     True
Name: day, Length: 244, dtype: bool

Pandas的 replace() 可与Excel的 Replace All

In [73]: tips.replace("Thu", "Thursday")
Out[73]: 
     total_bill    tip     sex smoker   day    time  size
67         1.07   1.00  Female    Yes   Sat  Dinner     1
92         3.75   1.00  Female    Yes   Fri  Dinner     2
111        5.25   1.00  Female     No   Sat  Dinner     1
145        6.35   1.50  Female     No  Thur   Lunch     2
135        6.51   1.25  Female     No  Thur   Lunch     2
..          ...    ...     ...    ...   ...     ...   ...
182       43.35   3.50    Male    Yes   Sun  Dinner     3
156       46.17   5.00    Male     No   Sun  Dinner     6
59        46.27   6.73    Male     No   Sat  Dinner     4
212       46.33   9.00    Male     No   Sat  Dinner     4
170       48.81  10.00    Male    Yes   Sat  Dinner     3

[244 rows x 7 columns]