【问题标题】:Creating a new column in the pandas dataframe depend on the other columns in the same dataframe but different rows在 pandas 数据框中创建新列取决于同一数据框中的其他列但不同的行
【发布时间】:2020-11-16 08:26:38
【问题描述】:

我是 python 新手。

我遇到了一个问题,我需要在数据框中创建一个新列,这取决于同一数据框中的其他列但不同的行。

df = pd.DataFrame({"Year":[2011,2014,2012,2013],"Value1":[10,40,20,30],"Value2":[10,100,30,60]})
df

        Year    Value1  Value2  Product
0   2011         10      10         1
1   2014         40      100        1
2   2012         20      30         1
3   2013         30      60         1
4   2011         10      10         2
5   2014         40      100        2
6   2012         20      30         2
7   2013         30      60         2
8   2011         10      10         3
9   2014         40      100        3
10  2012         20      30         3
11  2013         30      60         3

我想在今年和去年的基础上创建一个新列,新列 value3 应该成为这个和去年 value1 和 value2 之间差异的商,例如,2012 年行的 value3 应该由 (30-10)/(20-10) = 2 计算。

所以我预期的新数据框应该如下所示:

    Year    Value1  Value2  Product Value3
0   2011    10      10       1      NaN
1   2014    40      100      1      4.0
2   2012    20      30       1      2.0
3   2013    30      60       1      3.0
4   2011    10      10       2      NaN
5   2014    40      100      2      4.0
6   2012    20      30       2      2.0
7   2013    30      60       2      3.0
8   2011    10      10       3      NaN
9   2014    40      100      3      4.0
10  2012    20      30       3      2.0
11  2013    30      60       3      3.0

有人可以帮我吗?

我尝试使用 for 循环来获取每一行数据帧,但我发现很难获取去年的数据,因为它没有排序。

【问题讨论】:

  • 您说 2012 年的 value3 应该是 2,但您的预期输出是 3?
  • 尝试 DataFrame - apply() 函数
  • 对不起,我已经改变了我的预期输出

标签: python pandas dataframe


【解决方案1】:

首先sort_valuesYear,使用shift进行计算,然后sort_index保留原始顺序:

print (df.sort_values("Year")
         .assign(Value3=(df["Value2"]-df["Value2"].shift())/(df["Value1"]-df["Value1"].shift()))
         .sort_index())

   Year  Value1  Value2  Value3
0  2011      10      10     NaN
1  2014      40     100     4.0
2  2012      20      30     2.0
3  2013      30      60     3.0

【讨论】:

  • 您好,感谢您的回答!我遇到了一个新问题,数据集包含几个产品,它们都有几年的价值。这种方法已经不管用了,即使我选择先对产品名称进行排序,然后是年份,它仍然会使用最后一个产品 2014 年的数据来计算 2011 年的数据线。你有什么解决办法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
相关资源
最近更新 更多