如何转换Pandas DataFrame:以国家编码为标识,将metricId转为列?
解决方案:Metrics数据集转宽表(按国家+时间分组)
核心思路
直接通过筛选目标国家的时间范围 + 透视表转换,替代先提取时间再匹配的繁琐操作,一步生成符合要求的宽表。
假设原数据结构
假设你的原始metrics数据集结构如下(metricId存储指标类型,stringValue存国家编码,numericValue存指标数值):
| timeComputed | metricId | stringValue | numericValue |
|---|---|---|---|
| 2023-02-21 13:28:15.705... | countryCode | IN | NaN |
| 2023-02-21 13:28:15.705... | reporting:METRICS_COMPUTATION_DURATION | NaN | 2282 |
| 2023-02-21 13:28:15.705... | basic:COUNT_COLUMNS | NaN | 25 |
| 2023-02-21 13:28:38.354... | countryCode | IN | NaN |
| 2023-02-21 13:28:38.354... | reporting:METRICS_COMPUTATION_DURATION | NaN | 2765 |
方法1:用Pandas处理(Python)
import pandas as pd # 读取原始数据(替换成你的数据读取方式) # df = pd.read_csv("metrics_data.csv") # 1. 提取印度(IN)对应的所有时间点 in_time_list = df[(df["metricId"] == "countryCode") & (df["stringValue"] == "IN")]["timeComputed"].tolist() # 2. 筛选这些时间点的所有指标记录 filtered_df = df[df["timeComputed"].isin(in_time_list)] # 3. 提取国家编码并合并到主数据 country_info = filtered_df[filtered_df["metricId"] == "countryCode"][["timeComputed", "stringValue"]].rename(columns={"stringValue": "countryCode"}) merged_df = pd.merge(filtered_df[filtered_df["metricId"] != "countryCode"], country_info, on="timeComputed") # 4. 透视生成宽表 wide_table = merged_df.pivot_table( index=["countryCode", "timeComputed"], columns="metricId", values="numericValue", aggfunc="first" # 同一维度下指标唯一,取第一个值即可 ).reset_index() # 输出结果 print(wide_table)
如果你的原始数据已经直接包含countryCode列(无需从metricId中提取),可以简化为:
filtered_df = df[df["countryCode"] == "IN"] wide_table = filtered_df.pivot_table( index=["countryCode", "timeComputed"], columns="metricId", values="numericValue", aggfunc="first" ).reset_index()
方法2:用SQL处理(适用于Spark SQL/BigQuery等)
SELECT * FROM ( SELECT timeComputed, metricId, numericValue, -- 按时间分组提取国家编码 MAX(CASE WHEN metricId = 'countryCode' THEN stringValue END) OVER (PARTITION BY timeComputed) AS countryCode FROM your_metrics_table ) PIVOT ( MAX(numericValue) FOR metricId IN ( 'reporting:METRICS_COMPUTATION_DURATION', 'basic:COUNT_COLUMNS', 'col_stats:COUNT_NULL:EndCustomerAccount' ) ) WHERE countryCode = 'IN'
内容的提问来源于stack exchange,提问作者user4550079
相关产品推荐
相关产品推荐

