Python 3.x 从数据透视中的键列中减去列的子集
我有一个数据透视表,其中包含时间序列中的多列数据:Python 3.x 从数据透视中的键列中减去列的子集,python-3.x,pandas,pivot,Python 3.x,Pandas,Pivot,我有一个数据透视表,其中包含时间序列中的多列数据: A B C D 11/1/2018 1 5 5 7 11/2/2018 2 6 6 8 11/3/2018 3 7 7 9 对于本例,数据列中的值并不重要我想从列的子集中减去“键”列(本例中为A列)中的值:本例中为B&C列。然后,我想删除不在子集或键列中的任何列。结果将是: A B C 11
A B C D
11/1/2018 1 5 5 7
11/2/2018 2 6 6 8
11/3/2018 3 7 7 9
对于本例,数据列中的值并不重要我想从列的子集中减去“键”列(本例中为A列)中的值:本例中为B&C列。然后,我想删除不在子集或键列中的任何列。结果将是:
A B C
11/1/2018 1 4 4
11/2/2018 2 4 4
11/3/2018 3 4 4
我过去曾通过以下代码减去列:
df['dif'] = df['B'] -df['A']
但这将添加“dif”列。我想用B-A值替换B列。另外,与其一次只传递一条指令(B-a,C-a),不如传递类似于“if-column-in-list,subtract-key-column,else-drop-column”的列表
谢谢您可以使用
apply
从您选择的子集列中减去A,最后再次使用A连接
df['A'].to_frame().join(df[['B','C']].apply(lambda x: x - df['A']))
A B C
11/1/2018 1 4 4
11/2/2018 2 4 4
11/3/2018 3 4 4
pandas.DataFrame.sub
带axis=0
当从数据框中减去系列
时,默认情况下,数据框
的列将与系列
的索引
对齐。这就是使用-
运算符时发生的情况。但是,当使用pandas.DataFrame.sub
方法时,可以覆盖该默认值,并指定DataFrame
应将其索引与系列的索引对齐
def f(d, key, subset):
return d[[key]].join(d[subset].sub(d[key], axis=0))
f(df, 'A', ['B', 'C'])
A B C
11/1/2018 1 4 4
11/2/2018 2 4 4
11/3/2018 3 4 4
我有点困惑。似乎是说默认情况下对齐df w系列索引,然后指定df align w系列索引。这些对我来说似乎是一样的,只是你可以选择对齐方式。我是否正确地理解了您语句的意义?我说过,默认情况下,Series对象的index属性与DataFrame对象的columns属性对齐。使用sub
方法更改默认值,使Series对象的索引属性与DataFrame对象的索引属性对齐。这是否意味着不能从正确的日期中减去正确的日期?不,这样做是正确的。我正在考虑是否提供一个明确的问题和答案来说明这一点。那太好了-如果你这样做,请让我知道-似乎你说这两种方法都能提供正确的答案,所以我想了解这里的风险是什么。试图理解在风格上什么是最好的,以及为什么/什么时候不同属性之间的关系很重要Hanks Franco。我很感激你的回答——只是想确定这些答案中哪一个更有用/更具洞察力欢迎,我认为两个答案都能完成任务,而且非常相似,apply是一种更一般的方式,sub是一种更具体的方式。理解apply对你更有用,因为你可以在更多的场合使用它,但是如果你正在寻找完美的答案,我想应该是sub。我可以问一下,如果你不想删除不在子集中的列,你会如何更改这个答案?如果子集实际上是一个比df中的内容大的列表呢?例如(B,C,D,E)喜欢子集中的if列和df,然后应用lambda,否则保持该列不变