【问题标题】:unable to plot a pie chart无法绘制饼图
【发布时间】:2018-12-27 03:54:21
【问题描述】:

我有一个纪元纳秒的数据集

       M            d          time      
0  1081083  28000000000  1.530683e+18  
1  1081083  16000000000  1.530683e+18  
2  1081085  33000000000  1.530683e+18  
3  1081083  28000000000  1.530683e+18  
4  1081085  27000000000  1.530683e+18

转换后的样子是这样的:

      M         d           time
0  1081083  07:16:40 2018-07-04 05:42:20  
1  1081083  09:56:40 2018-07-04 05:43:03  
2  1081085  16:10:00 2018-07-04 05:43:12  
3  1081083  07:16:40 2018-07-04 05:43:51  
4  1081085  05:30:00 2018-07-04 05:44:01

将纪元转换为正常的代码是:

import pandas as pd
import time
import matplotlib.pyplot as plt


df1 = pd.read_csv('testsy_1.csv')

df1['time']=pd.to_datetime(df1['time'], unit='ns')

df1['d']=df1['d'].apply(lambda x: time.strftime("%H:%M:%S",time.localtime(x)))

但是当尝试获取 df1['M'],df1['d'] 的饼图时:

plt.figure(figsize=(16,8))
ax1 = plt.subplot(121, aspect='equal')
df1.plot(kind='pie', y = 'd', ax=ax1, autopct='%1.1f%%', 
startangle=90, shadow=False, labels=df1['M'], legend = False, fontsize=14)

我得到一个错误:

TypeError: Empty 'DataFrame': no numeric data to plot

由于转换后的数据已经存在,数据框如何为空?如何在此处绘制饼图?

按照@jezrael 的建议,我省略了df1['d']=df1['d'].apply(lambda x: time.strftime("%H:%M:%S",time.localtime(x))) 并执行了脚本,没有任何更改,为我获取数据集的 df.head() 的结果。

但是当将上述内容应用于大约 23000 行的完整数据集时,我得到了一个可怕的情节......有什么问题?

【问题讨论】:

    标签: python pandas pie-chart epoch


    【解决方案1】:

    有问题d 值不是数字。

    因此您可以将d 列转换为时间增量,然后转换为秒:

    df1['d'] = pd.to_timedelta(df1['d']).dt.total_seconds()
    print (df1)
             M        d                time
    0  1081083  26200.0 2018-07-04 05:42:20
    1  1081083  35800.0 2018-07-04 05:43:03
    2  1081085  58200.0 2018-07-04 05:43:12
    3  1081083  26200.0 2018-07-04 05:43:51
    4  1081085  19800.0 2018-07-04 05:44:01
    

    或者如果可能的话省略:

    df1['d']=df1['d'].apply(lambda x: time.strftime("%H:%M:%S",time.localtime(x)))
    

    【讨论】:

    • 省略 df1['d']=df1['d'].apply(lambda x: time.strftime("%H:%M:%S",time.localtime(x))) 有效,对 23000 行应用相同的策略不会给出令人愉快的饼图。请查看主要问题部分,我也更新了 23000 行的饼图屏幕截图。 @jezrael 哪里需要改变?
    • @suryarahul - 在我看来,问题在于逻辑 - 您为 DataFrame 的每一行绘制一个饼图。所以有可能像df = df.groupby('M', as_index=False)['d'].sum() 这样的聚合数据然后绘图。
    • df = df.groupby('M', as_index=False)['d'].sum() 是指每一行还是行的总和? @jezrael
    • @suryarahul - 是的,想法是创建更少的行,因为可以将 23k 行绘制成饼图,但结果很糟糕
    • 表示df = df.groupby('M', as_index=False)['d'].sum() 将给出行的聚合结果。一个问题@jezrael 如何将任何特定行绘制为饼图?
    猜你喜欢
    • 2016-08-26
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多