【问题标题】:Create a dummy column based on a different column基于不同的列创建一个虚拟列
【发布时间】:2022-10-24 09:39:23
【问题描述】:

我有面板数据,如果 ID 至少每季度连续交易一次,我想为每个时期的每个 ID 创建一个“活跃交易者”列

当前df

ID  date   trading   
A   2020Q1 4         
A   2020Q2 5         
A   2020Q3 0         
A   2020Q4 2         
A   2021Q1 1         
B   2019Q1 0         
B   2019Q2 1         
B   2019Q3 2         
C   2021Q1 3         
C   2021Q2 3         
C   2021Q3 4         
C   2021Q4 0         
...

想要的

ID  date   trading   active
A   2020Q1 4         1
A   2020Q2 5         1
A   2020Q3 0         0
A   2020Q4 2         0
A   2021Q1 1         0
B   2019Q1 0         0
B   2019Q2 1         0
B   2019Q3 2         0
C   2021Q1 3         1
C   2021Q2 3         1
C   2021Q3 4         1
C   2021Q4 0         0
...

【问题讨论】:

  • 您能否向我们展示您对给定示例的期望输出?
  • 同一年内连续?因为A的最后两条记录是连续的但不在同一年
  • @Rabinzel 所需的输出是“活动”列
  • @Chris 从 t=1 到当前期间连续

标签: python pandas


【解决方案1】:

您可以尝试如下:

import pandas as pd
import numpy as np

data  = {'ID': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C'],
         'date': ['2020Q1','2020Q2','2020Q3','2020Q4','2021Q1','2019Q1','2019Q2','2019Q3','2021Q1','2021Q2','2021Q3','2021Q4'],
         'trading': [4, 5, 0, 2, 1, 0, 1, 2, 3, 3, 4, 0],
         'active': [1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0]}
df = pd.DataFrame(data)

df_desired = df.copy()
df_desired.drop('active', inplace=True, axis=1)

df_desired['active'] = df_desired.groupby(['ID'])['trading'].cummin().gt(0).astype(int)

# there's a difference in dtype (int64 -> np.int32)
df['active'] = df_desired['active'].astype(np.int32)

# check if result matches desired output:
df.equals(df_desired) # True

解释. df.cummin 可用于返回每个组内交易者的累积最小值:

print(df_desired.groupby(['ID'])['trading'].cummin())

0     4
1     4
2     0
3     0
4     0
5     0
6     0
7     0
8     3
9     3
10    3
11    0
Name: trading, dtype: int64

所以,这是一种用0 填写所有内容的快速方法,只要我们点击第一个。接下来,我们简单地检查大于0,并使用.astype(int) 将生成的pd.SeriesTrue/False 转换为1/0。因此,最终结果变为:

print(df_desired.groupby(['ID'])['trading'].cummin().gt(0).astype(int))

0     1
1     1
2     0
3     0
4     0
5     0
6     0
7     0
8     1
9     1
10    1
11    0
Name: trading, dtype: int32

【讨论】:

  • 不是 cummin 应该找到一个累积最小值吗?
  • 呃..再一次,这不是我想要的。我想要列“活跃。不是 cummin。也许我的帖子不清楚。我会编辑它
  • 您将获得active 列;我只是解释中间发生的事情。 active 列是 (df_desired.groupby(['ID'])['trading'].cummin()>0).astype(int)
  • 啊啊啊啊啊啊啊
  • 所以,它只是一个单线。刚刚添加了一些关于它如何工作的信息,并表明结果等于您最初想要的输出。
【解决方案2】:

如果我理解正确,这些时期是连续的。然后这个工作:

import pandas as pd
dataframe = pd.DataFrame({"ID": ["A", "A", "A", "A", "A", "B", "B", "B", "C", "C", "C", "C"],
                          "date": ["2020Q1", "2020Q2", "2020Q3", "2020Q4", "2021Q1", "2019Q1", "2019Q2", "2019Q3", "2021Q1", "2021Q2", "2021Q3", "2021Q4"],
                          "trading": [4, 5, 0, 2, 1, 0, 1, 2, 3, 3, 4, 0]})

dataframe = dataframe.sort_values(["ID", "date"])

active = []
for index, row in dataframe.iterrows():
    # 0 means no active trading
    active_trading = 0
    id_dataframe = dataframe.loc[dataframe.ID==row.ID]
    if all(id_dataframe.loc[id_dataframe.index <= index].trading > 0):
        # 1 means active trading
        active_trading = 1
    active.append(active_trading)
dataframe["active"] = active
dataframe


ID  date    trading active
A   2020Q1  4       1
A   2020Q2  5       1
A   2020Q3  0       0
A   2020Q4  2       0
A   2021Q1  1       0
B   2019Q1  0       0
B   2019Q2  1       0
B   2019Q3  2       0
C   2021Q1  3       1
C   2021Q2  3       1
C   2021Q3  4       1
C   2021Q4  0       0

【讨论】:

  • 这与我的“活跃”列不同。我认为如果交易不为零,您所做的只是活跃=1。这不是我想要的。一个人只有在她/他在过去所有时期都进行过交易时才是活跃的. 所以A的2020Q4应该为零,2021Q1也是。
  • 啊,我看到了 2020 年第四季度。将查看连续位。既然 C 一直在 2021Q1、2021Q2、2021Q3 交易,为什么 2021Q1 应该为 0?那么 A 2020Q1 和 2020Q2 也应该是不活跃的吧?
  • 不是C,我的意思是A。
  • 将其固定为连续。这样好吗?
【解决方案3】:

一定要回答这个问题。提供详细信息并分享您的研究!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2014-06-19
    • 1970-01-01
    • 2019-03-18
    • 2011-04-16
    • 2022-08-12
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多