[英]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.