簡體   English   中英

如何使用 pandas 根據某個列中的值合並/划分數據框中的行?

[英]How to consolidate/divide rows within a data frame based on a value within a certain column using pandas?

開始的df如下:

company  metric  time   data
x        X10384  M1     100
x        X10384  M2     100
x        X10384  M3     100
y        X10456  M4     200
y        X10456  M5     200
y        X10456  M6     200

我需要能夠根據時間維度的值合並這些行。 基本上,“M1、M2、M3”將包含 Q1,“M4、M5、M6”將包含 Q2,依此類推。

生成的 df 將需要如下所示:

company  metric  time   data
x        X10384  Q1     300
y        X10456  Q2     600

同樣,如果從 df 開始,我將需要能夠將時間分成幾個月並將數據分成相等的三個,就像在初始 df 中一樣。

一個 go 將如何嘗試像上面那樣轉換這些數據? 以下是我的參考起點:

quarters = ['Q1', 'Q2']
months = ['M1','M2','M3','M4','M5','M6']

for time in df['time']:
    if time in quarters:
        [insert transformation into individual months]
    elif time in months:
        [insert transformation into quarters]

根據您的數據創建 dataframe:

data = {'Company' : ['x', 'x', 'x', 'y', 'y', 'y'],  
        'Metric' : ['X10384', 'X10384', 'X10384', 'X10456', 'X10456', 'X10456'],
        'time': ['M1', 'M2', 'M3', 'M4', 'M5', 'M6'],
        'data': [100, 100, 100, 200, 200, 200]}
df = pd.DataFrame(data)

然后每次創建一個字典和 map:

dict = {'M1': 'Q1', 'M2' : 'Q1', 'M3' : "Q1", 'M4' : 'Q2', 'M5' : 'Q2', 'M6' : 'Q2'}
df['time'] = df['time'].map(dict)

groupby 會給你最終的結果:

df.groupby(['Company','Metric','time']).sum().reset_index()

time列中提取數字,然后將它們轉換為季度數。 最后,一個簡單的groupby_sum完成這項工作:

# Convert M1, M2, M3, M4, M5, M6 to Q1, Q1, Q1, Q2, Q2, Q2
to_quarter = df['time'].str[1:].astype(int).floordiv(4).add(1).astype(str).radd('Q')

out = df.assign(time=to_quarter).groupby(['company', 'metric', 'time']) \
                                .sum().reset_index()

Output:

>>> out
  company  metric time  data
0       x  X10384   Q1   300
1       y  X10456   Q2   600

從幾個月到幾個季度

輸入

company  metric  time   data
x        X10384  M1     100
x        X10384  M2     100
x        X10384  M3     100
y        X10456  M4     200
y        X10456  M5     200
y        X10456  M6     200

創建一個字典,以月為鍵,以季度為值,map 使用鍵向上列

months_to_quarters_dict = {'M1': 'Q1', 'M2' : 'Q1', 'M3' : "Q1", 'M4' : 'Q2', 'M5' : 'Q2', 'M6' : 'Q2'}
df['time'] = df['time'].map(months_to_quarters_dict)

output (1a)

company  metric  time   data
x        X10384  Q1     100
x        X10384  Q1     100
x        X10384  Q1     100
y        X10456  Q2     200
y        X10456  Q2     200
y        X10456  Q2     200

使用 groupby().agg('sum') 得到濃縮的 df

df.groupby(['Company','Metric','time'], as_index=False).agg('sum')

output (1b)

company  metric  time   data
x        X10384  Q1     300
y        X10456  Q2     600

從季度到幾個月

輸入

company  metric  time   data
x        X10384  Q1     300
y        X10456  Q2     600

創建一個字典,其中以季度為鍵,以月為單位,map 使用鍵向上列

quarters_to_months_dict = {'Q1' : ['M1', 'M2', 'M3'], 'Q2' : ['M4', 'M5', 'M6']}
df['time'] = df['time'].map(months_to_quarters_dict)

output (2a)

  company  metric time  data
0       x  X10384   ['M1', 'M2', 'M3']   300
1       y  X10456   ['M4', 'M5', 'M6']   600

使用explode on time 列拆分行並將數據列除以3,以在一個季度中為每個月產生相等的數量

df = df.explode('time')
df['data'] = df['data].div(3)

output (2b)

company  metric  time   data
x        X10384  M1     100
x        X10384  M2     100
x        X10384  M3     100
y        X10456  M4     200
y        X10456  M5     200
y        X10456  M6     200

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM