Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 从数据透视中的键列中减去列的子集_Python 3.x_Pandas_Pivot - Fatal编程技术网

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,否则保持该列不变