我不認為我的標題準確地表達了我的問題,但我為此掙扎了一會兒。我有一系列 CSV 檔案。這些檔案包含列名和值。我當前的代碼完全按照我的意愿作業,因為它按時間對資料進行分組,然后讓我計算每小時的使用量和每小時的收入。但是我現在想改進它,在我的 CSV 中有一個名為 Machine Name 的列名。此列中的每個值都是唯一的,但它們共享相同的命名方案。它們可以是烘干機 #39 或烘干機 #38 或洗衣機 #1 或洗衣機 #12。我想要的是計算每小時使用的干衣機和洗衣機的數量,我不在乎它是多少洗衣機或干衣機。只是它是洗衣機或烘干機。
這是我的代碼。
for i in range(1): # len(csvList))
df = wr.s3.read_csv(path=[f's3://{csvList[i].bucket_name}/{csvList[i].key}'])
df['Timestamp'] = pd.to_datetime(df['Timestamp'])
df = df.groupby(df['Timestamp'].dt.floor('h')).agg(
machines_used_per_hour=('Machine Name', 'count'),
revenue_per_hour=('Total Revenue', 'sum')
).reset_index() # Reset the index for the timestamp column
for j in df.iterrows():
dbInsert = """INSERT INTO `store-machine-use`(store_id, timestamp, machines_used_per_hour, revenue_per_hour, notes) VALUES (%s, %s, %s, %s, %s)"""
values = (int(storeNumberList[i]), str(j[1]['Timestamp']), int(j[1]['machines_used_per_hour']), int(j[1]['revenue_per_hour']),'')
cursor.execute(dbInsert, values)
cnx.commit()
此資料進入資料庫,如下所示:
store_id,時間戳,machines_used_per_hour,revenue_per_hour,notes
10, 2021-08-22 06:00:00, 4, 14, 測驗
我想獲得每小時使用的機器型別的單獨計數,在我的示例中,它看起來像:
store_id,時間戳,machines_used_per_hour,revenue_per_hour,washers_per_hour,dryers_per_hour,notes
10, 2021-08-22 06:00:00, 4, 14, 1, 3, 測驗
uj5u.com熱心網友回復:
你 cout 使用pd.Series.str.startswith然后在聚合中求和:
df['is_dryer'] = df['Machine Name'].startswith('Dryer')
df['is_washer'] = df['Machine Name'].startswith('Washer')
df = df.groupby(df['Timestamp'].dt.floor('h')).agg(
machines_used_per_hour=('Machine Name', 'count'),
revenue_per_hour=('Total Revenue', 'sum'),
washers_per_hour=('is_washer', 'sum'),
dryers_per_hour=('is_dryer', 'sum')
).reset_index() # Reset the index for the timestamp column
請注意,如果您需要更復雜的模式匹配來確定哪臺機器屬于哪個類別,您可以使用帶有pd.Series.str.match 的正則運算式
例子
例如有一些假資料,如果我有:
dataframe = pd.DataFrame(
{"machine": ["Dryer #1", "Dryer #2", "Washer #43", "Washer #89", "Washer #33"],
"aggregation_key": [1, 2, 1, 2, 2]}
)
創建布爾列后
dataframe["is_dryer"] = dataframe.machine.str.startswith("Dryer")
dataframe["is_washer"] = dataframe.machine.str.startswith("Washer")
資料框將是
machine aggregation_key is_dryer is_washer
0 Dryer #1 1 True False
1 Dryer #2 2 True False
2 Washer #43 1 False True
3 Washer #89 2 False True
4 Washer #33 2 False True
然后聚合給你你想要的:
dataframe.groupby(dataframe["aggregation_key"]).agg(
washers_per_hour=('is_washer', 'sum'),
dryers_per_hour=('is_dryer', 'sum')
).reset_index()
結果將是
aggregation_key washers_per_hour dryers_per_hour
0 1 1 1
1 2 2 1
uj5u.com熱心網友回復:
您可以使用正則運算式替換通用機器號識別符號模式以創建一個machine_type系列,然后您可以使用該系列進行聚合。
df['Machine Type'] = df['Machine Name'].str.replace(' #[0-9]', '', regex=True)
然后你可以在 Machine Type
df = df.groupby(df['Timestamp'].dt.floor('h')).agg(
machines_used_per_hour=('Machine Type', 'count'),
revenue_per_hour=('Total Revenue', 'sum')
).reset_index()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/369909.html
下一篇:回圈嵌套字典
