栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在每个列都有系列的DataFrame上进行操作

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在每个列都有系列的DataFrame上进行操作

请承担序言。首先解决一些更高层次的概念很重要。由于我的动机是分享知识和授课,所以我想使这一点尽可能清晰。


它有利于建立一个什么样的心理模型

Series
Dataframe
对象。

解剖
Series

Series
应该将A视为增强型词典。这并不总是一个完美的类比,但是我们将从这里开始。另外,您还可以进行其他类比,但我将目标放在字典上,以证明本文的目的。

index

这些是我们可以参考以获取相应值的键。当索引的元素是唯一的时,与字典的比较变得非常接近。

values

这些是由索引键入的相应值。

解剖
Dataframe

一个

Dataframe
应该被看作是一个字典
Series
Series
Series
。在这种情况下,键是列名称,值是列本身作为
Series
对象。每个人都
Series
同意分享相同的内容
index
,这是的索引
Dataframe

columns

这些是我们可以参考以获取相应键的键

Series

index

这是所有

Series
值均同意共享的索引。

注意:RE:
columns
index
对象

它们是同一种东西。甲

Dataframe
小号
index
可以用作另一
Dataframe
小号
columns
。实际上,当您进行
df.T
移调时会发生这种情况。

values

这是一个二维数组,其中包含数据

Dataframe
。现实情况是,
values
不是
有什么存储在里面
Dataframe
的对象。(有时候是这样,但是我不想描述块管理器)。关键是,最好将其视为对数据二维数组的访问。


定义样本数据

这些样本

pandas.Index
可以被用作对象
index
的一个
Series
Dataframe
或可以用作所述
columns
的一
Dataframe

idx_lower = pd.Index([*'abcde'], name='lower')idx_range = pd.RangeIndex(5, name='range')

这些是

pandas.Series
使用上述
pandas.Index
对象的示例对象

s0 = pd.Series(range(10, 15), idx_lower)s1 = pd.Series(range(30, 40, 2), idx_lower)s2 = pd.Series(range(50, 10, -8), idx_range)

这些是

pandas.Dataframe
使用上述
pandas.Index
对象的示例对象

df0 = pd.Dataframe(100, index=idx_range, columns=idx_lower)df1 = pd.Dataframe(    np.arange(np.product(df0.shape)).reshape(df0.shape),    index=idx_range, columns=idx_lower)

Series
Series

当在两个上操作时

Series
,对齐是显而易见的。您将
index
其中一个
Series
index
另一个对齐。

s1 + s0lowera    40b    43c    46d    49e    52dtype: int64

这与我在操作前随机洗牌时的情况相同。索引仍将对齐。

s1 + s0.sample(frac=1)lowera    40b    43c    46d    49e    52dtype: int64

而且是 不是
时候,而不是我与洗牌的值进行操作的情况

Series
。在这种情况下,Pandas不需要
index
与之对齐,因此只能从某个位置操作。

s1 + s0.sample(frac=1).valueslowera    42b    42c    47d    50e    49dtype: int64

添加标量

s1 + 1lowera    31b    33c    35d    37e    39dtype: int64

Dataframe
Dataframe

在两个

Dataframe
s之间进行操作时,类似情况也是如此
。对齐是显而易见的,并且执行了我们认为应该做的事情

df0 + df1lower    a    b    c    d    erange   0      100  101  102  103  1041      105  106  107  108  1092      110  111  112  113  1143      115  116  117  118  1194      120  121  122  123  124

Dataframe
在两个轴上随机播放秒。在
index
columns
仍然对齐,给我们同样的事情。

df0 + df1.sample(frac=1).sample(frac=1, axis=1)lower    a    b    c    d    erange   0      100  101  102  103  1041      105  106  107  108  1092      110  111  112  113  1143      115  116  117  118  1194      120  121  122  123  124

同样的改组,但添加数组而不是

Dataframe
。不再对齐,将获得不同的结果。

df0 + df1.sample(frac=1).sample(frac=1, axis=1).valueslower    a    b    c    d    erange   0      123  124  121  122  1201      118  119  116  117  1152      108  109  106  107  1053      103  104  101  102  1004      113  114  111  112  110

添加一维数组。将与列对齐并跨行广播。

df0 + [*range(2, df0.shape[1] + 2)]lower    a    b    c    d    erange   0      102  103  104  105  1061      102  103  104  105  1062      102  103  104  105  1063      102  103  104  105  1064      102  103  104  105  106

添加标量。没有什么可以与所有广播内容保持一致的

df0 + 1lower    a    b    c    d    erange   0      101  101  101  101  1011      101  101  101  101  1012      101  101  101  101  1013      101  101  101  101  1014      101  101  101  101  101

Dataframe
Series

如果将

Dataframe
s视为值的字典,
Series
并将s
Series
视为值的字典,那么很自然的是,在a
Dataframe
和之间进行操作时
Series
,应按“键”对齐它们。

s0:lower    a    b    c    d    e        10   11   12   13   14df0:lower    a    b    c    d    erange   0      100  100  100  100  1001      100  100  100  100  1002      100  100  100  100  1003      100  100  100  100  1004      100  100  100  100  100

当我们进行操作时,

10
in
s0['a']
被添加到
df0['a']

df0 + s0lower    a    b    c    d    erange   0      110  111  112  113  1141      110  111  112  113  1142      110  111  112  113  1143      110  111  112  113  1144      110  111  112  113  114

问题的核心和帖子的重点

如果我要

s2
df0
怎么办?

s2:    df0:  |    lower    a    b    c    d    erange        |    range   0      50    |    0      100  100  100  100  1001      42    |    1      100  100  100  100  1002      34    |    2      100  100  100  100  1003      26    |    3      100  100  100  100  1004      18    |    4      100  100  100  100  100

当我手术时,我得到

np.nan
了问题中所引用的一切

df0 + s2        a   b   c   d   e   0   1   2   3   4range       0     NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN1     NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN2     NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN3     NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN4     NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

这不会产生我们想要的。因为Pandas正在将

index
of
s2
columns
of对齐
df0
。该
columns
结果包含的工会
index
s2
columns
df0

我们可以通过棘手的换位来伪造它

(df0.T + s2).Tlower    a    b    c    d    erange   0      150  150  150  150  1501      142  142  142  142  1422      134  134  134  134  1343      126  126  126  126  1264      118  118  118  118  118

但是事实证明,熊猫有更好的解决方案。有一些操作方法可让我们传递

axis
参数以指定要对齐的轴。

-
sub

+
add

*
mul

/
div

**
pow

所以答案很简单

df0.add(s2, axis='index')lower    a    b    c    d    erange   0      150  150  150  150  1501      142  142  142  142  1422      134  134  134  134  1343      126  126  126  126  1264      118  118  118  118  118

原来

axis='index'
是的同义词
axis=0

由于是
axis='columns'
同义
axis=1

df0.add(s2, axis=0)lower    a    b    c    d    erange   0      150  150  150  150  1501      142  142  142  142  1422      134  134  134  134  1343      126  126  126  126  1264      118  118  118  118  118

其余操作

df0.sub(s2, axis=0)lower   a   b   c   d   erange         0      50  50  50  50  501      58  58  58  58  582      66  66  66  66  663      74  74  74  74  744      82  82  82  82  82

df0.mul(s2, axis=0)lower     a     b     c     d     erange        0      5000  5000  5000  5000  50001      4200  4200  4200  4200  42002      3400  3400  3400  3400  34003      2600  2600  2600  2600  26004      1800  1800  1800  1800  1800

df0.div(s2, axis=0)lower         a         b         c         d         erange      0      2.000000  2.000000  2.000000  2.000000  2.0000001      2.380952  2.380952  2.380952  2.380952  2.3809522      2.941176  2.941176  2.941176  2.941176  2.9411763      3.846154  3.846154  3.846154  3.846154  3.8461544      5.555556  5.555556  5.555556  5.555556  5.555556

df0.pow(1 / s2, axis=0)lower         a         b         c         d         erange      0      1.096478  1.096478  1.096478  1.096478  1.0964781      1.115884  1.115884  1.115884  1.115884  1.1158842      1.145048  1.145048  1.145048  1.145048  1.1450483      1.193777  1.193777  1.193777  1.193777  1.1937774      1.291550  1.291550  1.291550  1.291550  1.291550


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/625491.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号