数据分析-pandas(二)

简介: DataFrame是一个二维标记数据结构,其中包含可能不同类型的列。您可以将其视为电子表格或SQL表,或者Series对象的字典。它通常是最常用的pandas对象。与Series一样,DataFrame接受许多不同类型的输入: 一维ndarray,列表,字典,或字典的Series

简介:

本片文章我们来介绍pandas的另一个数据类型DataFrame

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

一维ndarray,列表,字典,或字典的Series

二维numpy.ndarray

结构化或记录数组

一个Series

其他DataFrame等

除了数据之外,您还可以选择传递索引(行标签)和列(列标签)参数。如果您传递索引和/或列,则可以保证生成的DataFrame的索引和/或列。因此,Series的字典加上特定索引将丢弃所有与传递的索引不匹配的数据。如果未传递轴标签,他们将根据常识规则从输入数据构建。

一,1.1来自Series字典或字典

生成的索引将是各个系列的索引的并集。如果有任何嵌套字典他们将首先转化为系列。如果每日有传递列,则列将是字典键的有序列表。

d={

"one":pd.Series([1.0,2.0,3.0],index=["a","b","c"]),

"two":pd.Series([1.0,2.0,3.0,4.0],index=["a","b","c","d"]),

}

df = pd.DataFrame(d)

one  two

a  1.0  1.0

b  2.0  2.0

c  3.0  3.0

d  NaN  4.0



pd.DataFrame(d, index=["d", "b", "a"])


 one  two

d  NaN  4.0

b  2.0  2.0

a  1.0  1.0


pd.DataFrame(d, index=["d", "b", "a"], columns=["two", "three"])


two three

d  4.0   NaN

b  2.0   NaN

a  1.0   NaN

可以通过访问index喝columns属性来分别访问行和列 标签:

df.index

Out: Index(['a', 'b', 'c', 'd'], dtype='object')

df.columns

Out: Index(['one', 'two'], dtype='object')

1.2 来自ndarray或者列表的字典:

ndarray的长度必须相同。如果传递索引,他也必须与数组的长度相同,如果没有传递索引,结果将为range(n),n为数组长度。

d = {"one": [1.0, 2.0, 3.0, 4.0], "two": [4.0, 3.0, 2.0, 1.0]}

pd.DataFrame(d)


pd.DataFrame(d, index=["a", "b", "c", "d"])

one  two

0  1.0  4.0

1  2.0  3.0

2  3.0  2.0

3  4.0  1.0

one  two

a  1.0  4.0

b  2.0  3.0

c  3.0  2.0

d  4.0  1.0

1.3来自结构化或记录数组;

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

data = np.zeros((2,), dtype=[("A", "i4"), ("B", "f4"), ("C", "a10")])

data[:] = [(1, 2.0, "Hello"), (2, 3.0, "World")]

pd.DataFrame(data)

  A    B         C

0  1  2.0  b'Hello'

1  2  3.0  b'World'


pd.DataFrame(data, index=["first", "second"])

       A    B         C

first   1  2.0  b'Hello'

second  2  3.0  b'World'


pd.DataFrame(data, columns=["C", "A", "B"])

         C  A    B

0  b'Hello'  1  2.0

1  b'World'  2  3.0

1.4来自字典列表:

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

pd.DataFrame(data2)

  a   b     c

0  1   2   NaN

1  5  10  20.0


pd.DataFrame(data2, index=["first", "second"])

       a   b     c

first   1   2   NaN

second  5  10  20.0


pd.DataFrame(data2, columns=["a", "b"])

  a   b

0  1   2

1  5  10

1.4来自元组的字典:

可以通过传递元组字典来自动创建MultiIndexed frame

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},

     }

  )

      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

1.5 来自Series

结果将是一个与输入Series具有相同索引的DataFrame,并且其中一列的名称是Series的原始名称(仅当 为提供其他列名称时)

ser = pd.Series(range(3), index=list("abc"), name="ser")

pd.DataFrame(ser)


  ser

a    0

b    1

c    2

二,代替构造函数:

2.1DataFrame.from_dict

DataFrame.from_dict()接受一个字典或一个近似数组序列的字典并返回一个DataFrame。他的操作类似于DataFrame构造函数,除了默认 orient参数是columns之外,还可以设置该参数index使用字典键作为行标签。

pd.DataFrame.from_dict(dict([("A", [1, 2, 3]), ("B", [4, 5, 6])]))


  A  B

0  1  4

1  2  5

2  3  6

通过orient='index' 键将是行标签。在这种情况下,还可以传递所需列的名称。

pd.DataFrame.from_dict(

     dict([("A", [1, 2, 3]), ("B", [4, 5, 6])]),

     orient="index",

     columns=["one", "two", "three"],

  one  two  three

A    1    2      3

B    4    5      6

2.2DataFrame.from_records

DataFrame.from_records()接收元组列表或具有结构化数据类型的ndarray。他的工作方式与普通DataFrame构造函数类似,只是生成的DataFrame 索引可能是结构化数据类型的特定字段。

data

array([(1, 2., b'Hello'), (2, 3., b'World')],

     dtype=[('A', '<i4'), ('B', '<f4'), ('C', 'S10')])


pd.DataFrame.from_records(data, index="C")

         A    B

C              

b'Hello'  1  2.0

b'World'  2  3.0

三,列表的选择,删除,添加

可以将DataFrame语义视为相似索引Series对象的字典。获取设置和删除列的语法与类似的dict操作相同

df["one"]

a    1.0

b    2.0

c    3.0

d    NaN

Name: one, dtype: float64


df["three"] = df["one"] * df["two"]

df["flag"] = df["one"] > 2

df


  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

也可以像字典一样删除或弹出列:

del df["two"]

three = df.pop("three")

df

  one   flag

a  1.0  False

b  2.0  False

c  3.0   True

d  NaN  False

当插入标量值时,他自然会传播以填充列:

df["foo"] = "bar"

df


  one   flag  foo

a  1.0  False  bar

b  2.0  False  bar

c  3.0   True  bar

d  NaN  False  bar

当插入与Series不具有相同索引的DataFrame时,他将符合DataFrame的索引


Idf["one_trunc"] = df["one"][:2]

I df


  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

四,在方法链中分配新列

DataFrame中有一种assign()方法可以轻松创建可能从现有列派生的新列

iris = pd.read_csv("data/iris.data")

iris.head()


  SepalLength  SepalWidth  PetalLength  PetalWidth         Name

0          5.1         3.5          1.4         0.2  Iris-setosa

1          4.9         3.0          1.4         0.2  Iris-setosa

2          4.7         3.2          1.3         0.2  Iris-setosa

3          4.6         3.1          1.5         0.2  Iris-setosa

4          5.0         3.6          1.4         0.2  Iris-setosa


iris.assign(sepal_ratio=iris["SepalWidth"] / iris["SepalLength"]).head()


  SepalLength  SepalWidth  PetalLength  PetalWidth         Name  sepal_ratio

0          5.1         3.5          1.4         0.2  Iris-setosa     0.686275

1          4.9         3.0          1.4         0.2  Iris-setosa     0.612245

2          4.7         3.2          1.3         0.2  Iris-setosa     0.680851

3          4.6         3.1          1.5         0.2  Iris-setosa     0.673913

4          5.0         3.6          1.4         0.2  Iris-setosa     0.720000

在上面的示例中,我们插入了一个预先计算的值。我们还可以传入一个只有一个参数的函数,以便在分配给的DataFrame上进行计算。

iris.assign(sepal_ratio=lambda x: (x["SepalWidth"] / x["SepalLength"])).head()


  SepalLength  SepalWidth  PetalLength  PetalWidth         Name  sepal_ratio

0          5.1         3.5          1.4         0.2  Iris-setosa     0.686275

1          4.9         3.0          1.4         0.2  Iris-setosa     0.612245

2          4.7         3.2          1.3         0.2  Iris-setosa     0.680851

3          4.6         3.1          1.5         0.2  Iris-setosa     0.673913

4          5.0         3.6          1.4         0.2  Iris-setosa     0.720000

assign()始终返回数据的副本,保持原始的DataFrame不变。

五,索引

选择 语法 结果
选择列 df[col] Series
按标签选择行 df.loc[label] Series
按整数位置选择行 df.iloc[loc] Series
切片行 df[5:10] DataFrame
通过布尔向量选择行 df[bool_vec] DataFrame

例如,行选择返回一个Series,其索引是DataFrame的列

df.loc["b"]


one            2.0

bar            2.0

flag         False

foo            bar

one_trunc      2.0

Name: b, dtype: object


df.iloc[2]


one           3.0

bar           3.0

flag         True

foo           bar

one_trunc     NaN

Name: c, dtype: object

六,数据对齐:

对象之间的数据对齐会在列和索引DataFrame上自动对齐,同样,生成的对象将具有列标签和行标签的并集

df = pd.DataFrame(np.random.randn(10, 4), columns=["A", "B", "C", "D"])In [95]: df2 = pd.DataFrame(np.random.randn(7, 3), columns=["A", "B", "C"])

df + df2


         A         B         C   D

0  0.045691 -0.014138  1.380871 NaN

1 -0.955398 -1.501007  0.037181 NaN

2 -0.662690  1.534833 -0.859691 NaN

3 -2.452949  1.237274 -0.133712 NaN

4  1.414490  1.951676 -2.320422 NaN

5 -0.494922 -1.649727 -1.084601 NaN

6 -1.047551 -0.748572 -0.805479 NaN

7       NaN       NaN       NaN NaN

8       NaN       NaN       NaN NaN

9       NaN       NaN       NaN NaN

DataFrame和Series之间执行操作时,默认行为是对齐列上的索引,从而按行广播,

df - df.iloc[0]


         A         B         C         D

0  0.000000  0.000000  0.000000  0.000000

1 -1.359261 -0.248717 -0.453372 -1.754659

2  0.253128  0.829678  0.010026 -1.991234

3 -1.311128  0.054325 -1.724913 -1.620544

4  0.573025  1.500742 -0.676070  1.367331

5 -1.741248  0.781993 -1.241620 -2.053136

6 -1.240774 -0.869551 -0.153282  0.000430

7 -0.743894  0.411013 -0.929563 -0.282386

8 -1.194921  1.320690  0.238224 -1.482644

9  2.293786  1.856228  0.773289 -1.446531

相关文章
|
4天前
|
数据采集 数据可视化 数据挖掘
Pandas数据应用:天气数据分析
本文介绍如何使用 Pandas 进行天气数据分析。Pandas 是一个强大的 Python 数据处理库,适合处理表格型数据。文章涵盖加载天气数据、处理缺失值、转换数据类型、时间序列分析(如滚动平均和重采样)等内容,并解决常见报错如 SettingWithCopyWarning、KeyError 和 TypeError。通过这些方法,帮助用户更好地进行气候趋势预测和决策。
94 71
|
3天前
|
存储 数据采集 数据可视化
Pandas数据应用:电子商务数据分析
本文介绍如何使用 Pandas 进行电子商务数据分析,涵盖数据加载、清洗、预处理、分析与可视化。通过 `read_csv` 等函数加载数据,利用 `info()` 和 `describe()` 探索数据结构和统计信息。针对常见问题如缺失值、重复记录、异常值等,提供解决方案,如 `dropna()`、`drop_duplicates()` 和正则表达式处理。结合 Matplotlib 等库实现数据可视化,探讨内存不足和性能瓶颈的应对方法,并总结常见报错及解决策略,帮助提升电商企业的数据分析能力。
97 73
|
2月前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
81 0
|
4天前
|
数据采集 数据可视化 索引
Pandas数据应用:股票数据分析
本文介绍了如何使用Pandas库进行股票数据分析。首先,通过pip安装并导入Pandas库。接着,从本地CSV文件读取股票数据,并解决常见的解析错误。然后,利用head()、info()等函数查看数据基本信息,进行数据清洗,处理缺失值和重复数据。再者,结合Matplotlib和Seaborn进行数据可视化,绘制收盘价折线图。最后,进行时间序列分析,设置日期索引、重采样和计算移动平均线。通过这些步骤,帮助读者掌握Pandas在股票数据分析中的应用。
32 5
|
2月前
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
Pandas 和 NumPy 是 Python 中不可或缺的数据处理和分析工具。本文通过实际案例深入剖析了 Pandas 的数据清洗、NumPy 的数组运算、结合两者进行数据分析和特征工程,以及 Pandas 的时间序列处理功能。这些高级技巧能够帮助我们更高效、准确地处理和分析数据,为决策提供支持。
50 2
|
2月前
|
存储 数据挖掘 数据处理
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第26天】Python 是数据分析领域的热门语言,Pandas 库以其高效的数据处理功能成为数据科学家的利器。本文介绍 Pandas 在数据读取、筛选、分组、转换和合并等方面的高效技巧,并通过示例代码展示其实际应用。
53 2
|
2月前
|
数据采集 数据可视化 数据挖掘
Python数据分析:Pandas库实战指南
Python数据分析:Pandas库实战指南
|
2月前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
2月前
|
数据采集 数据可视化 数据挖掘
利用Python进行数据分析:Pandas库实战指南
利用Python进行数据分析:Pandas库实战指南
|
3月前
|
机器学习/深度学习 数据采集 算法
探索Python科学计算的边界:NumPy、Pandas与SciPy在大规模数据分析中的高级应用
【10月更文挑战第5天】随着数据科学和机器学习领域的快速发展,处理大规模数据集的能力变得至关重要。Python凭借其强大的生态系统,尤其是NumPy、Pandas和SciPy等库的支持,在这个领域占据了重要地位。本文将深入探讨这些库如何帮助科学家和工程师高效地进行数据分析,并通过实际案例来展示它们的一些高级应用。
70 0
探索Python科学计算的边界:NumPy、Pandas与SciPy在大规模数据分析中的高级应用