【问题标题】:Python Pandas groupBy conditionPython Pandas groupBy 条件
【发布时间】:2020-10-05 06:02:35
【问题描述】:

我有一个来自 CSV 文件的数据框,格式如下:

"name";"elapsed"
"etl_A";6.13e-05
"stl_A";0.0001
"etl_B";0.001
"stl_B";0.0003
"etl_C";23.2e-06
...

使用 Python Pandas,我想将数据框转换为以下格式:

benchmark_name;etl_elpased;stl_elapsed
A;6.13e-05;0.0001
B;0.001;0.0003
C;23.2e-06;...

我已经在其他语言中使用各自的groupBy 方法结合正则表达式来提取基准名称,但我对 Python 和 Pandas 都是新手。据我了解,Pandas groupBy 函数的行为与其他语言不同,我无法弄清楚。

我尝试过这样的事情:

def extract_benchmark_name(full_name: str) -> str:
    return regex.match(full_name).groups()[1]

df = pandas.read_csv(source, header=0, sep=';')
etl_df = df['etl' in df['name']]
stl_df = df['stl' in df['name']]

etl_df['name'] = etl_df['name'].apply(extract_benchmark_name)
stl_df['name'] = stl_df['name'].apply(extract_benchmark_name)

但是这看起来不正确,并且还给了我各种错误。

最终,我想将它与 matplotlib 相结合,生成这样的条形图,其中包含比较 etl 和 stl 的标准化值:

非常感谢您对完成这两项任务的任何帮助,谢谢!

【问题讨论】:

    标签: python pandas dataframe csv matplotlib


    【解决方案1】:

    尝试(使用@TrentonMcKinney 改进更新):

    df[['Benchmark', 'Type']] = df.name.str.split('_', expand=True) 
    ax = df.pivot('Type','Benchmark','elapsed').plot.bar(color=['b','r'], width=.95, edgecolor='w', alpha=.8)
    ax.legend(loc='lower center', bbox_to_anchor=(.5,1.01), ncol=2, frameon=False)
    

    输出:

    【讨论】:

    • @AndyL。谢谢!我很感激!
    • 使用连接可能是矫枉过正。 df[['bm_name', 'name']] = df.name.str.split('_', expand=True)
    • @TrentonMcKinney 是正确的。更好的语法。介意我加吗?
    • 我觉得很好。
    • 非常感谢!有一件事,我忘了提到在name 列中,AB 本身可能包含下划线,这似乎破坏了您由于split 而提供的代码 - 我该如何解决这个问题?跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2013-06-20
    • 2023-02-25
    • 2018-07-22
    • 2019-08-10
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多