Python 如何创建统计dataframe单列不同值的条形图

Python 如何创建统计dataframe单列不同值的条形图,python,plotly-dash,Python,Plotly Dash,我不熟悉python,也不熟悉dash。我在《plotly dash datatable用户指南》中看到了允许用户上传文件和自动绘制图形的代码。我希望在用户上传文件时,图形更改为在单个列中计算不同的值。例如: Country Guinea Guinea Guinea Liberia Liberia 我希望条形图的x轴是国家名称,y轴是几内亚和利比里亚的数量。有人能教我怎么做吗 以下是用户指南代码: import base64 import io import dash from dash.

我不熟悉python,也不熟悉dash。我在《plotly dash datatable用户指南》中看到了允许用户上传文件和自动绘制图形的代码。我希望在用户上传文件时,图形更改为在单个列中计算不同的值。例如:

Country
Guinea
Guinea 
Guinea
Liberia 
Liberia
我希望条形图的x轴是国家名称,y轴是几内亚和利比里亚的数量。有人能教我怎么做吗

以下是用户指南代码:

import base64
import io
import dash
from dash.dependencies import Input, Output, State
import dash_core_components as dcc
import dash_html_components as html
import dash_table
import pandas as pd

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div([
    dcc.Upload(
        id='datatable-upload',
        children=html.Div([
            'Drag and Drop or ',
            html.A('Select Files')
        ]),
        style={
            'width': '100%', 'height': '60px', 'lineHeight': '60px',
            'borderWidth': '1px', 'borderStyle': 'dashed',
            'borderRadius': '5px', 'textAlign': 'center', 'margin': '10px'
        },
    ),
    dash_table.DataTable(id='datatable-upload-container'),
    dcc.Graph(id='datatable-upload-graph')
])


def parse_contents(contents, filename):
    content_type, content_string = contents.split(',')
    decoded = base64.b64decode(content_string)
    if 'csv' in filename:
        # Assume that the user uploaded a CSV file
        return pd.read_csv(
            io.StringIO(decoded.decode('utf-8')))
    elif 'xls' in filename:
        # Assume that the user uploaded an excel file
        return pd.read_excel(io.BytesIO(decoded))


@app.callback([Output('datatable-upload-container', 'data'),
               Output('datatable-upload-container', 'columns')],
              [Input('datatable-upload', 'contents')],
              [State('datatable-upload', 'filename')])
def update_output(contents, filename):
    if contents is None:
        return [{}], []
    df = parse_contents(contents, filename)
    return df.to_dict('records'), [{"name": i, "id": i} for i in df.columns]


@app.callback(Output('datatable-upload-graph', 'figure'),
              [Input('datatable-upload-container', 'data')])
def display_graph(rows):
    df = pd.DataFrame(rows)

    if (df.empty or len(df.columns) < 1):
        return {
            'data': [{
                'x': [],
                'y': [],
                'type': 'bar'
            }]
        }
    return {
        'data': [{
            'x': df[df.columns[0]],
            'y': df[df.columns[1]],
            'type': 'bar'
        }]
    }


if __name__ == '__main__':
    app.run_server(debug=True)
导入base64
输入io
导入破折号
从dash.dependencies导入输入、输出和状态
将仪表板核心组件作为dcc导入
将dash_html_组件导入为html
导入破折号表
作为pd进口熊猫
外部_样式表=['https://codepen.io/chriddyp/pen/bWLwgP.css']
app=dash.dash(名称,外部样式表=外部样式表)
app.layout=html.Div([
上传(
id='datatable-upload',
children=html.Div([
'拖放或',
html.A('选择文件')
]),
风格={
“宽度”:“100%,“高度”:“60px”,“线宽”:“60px”,
“borderWidth”:“1px”,“borderStyle”:“虚线”,
“边界半径”:“5px”,“textAlign”:“中心”,“边距”:“10px”
},
),
dash_table.DataTable(id='DataTable-upload-container'),
dcc.Graph(id='datatable-upload-Graph')
])
def parse_内容(内容、文件名):
内容类型,内容字符串=contents.split(','))
decoded=base64.b64解码(内容\字符串)
如果文件名中有“csv”:
#假设用户上传了一个CSV文件
返回pd.read\u csv(
io.StringIO(已解码。解码('utf-8'))
文件名中的elif“xls”:
#假设用户上载了一个excel文件
返回pd.read_excel(io.BytesIO(已解码))
@app.callback([Output('datatable-upload-container','data'),
输出('datatable-upload-container','columns')],
[输入('datatable-upload','contents')],
[状态('datatable-upload','filename'))
def update_输出(内容、文件名):
如果内容为无:
返回[{}],]
df=解析_内容(内容、文件名)
返回df.to_dict('records'),[{“name”:i,“id”:i}表示df.columns中的i]
@应用程序回调(输出('datatable-upload-graph','figure'),
[输入('datatable-upload-container','data'))
def显示图表(行):
df=pd.DataFrame(行)
如果(df.空或len(df.列)<1):
返回{
“数据”:[{
“x”:[],
“y”:[],
“type”:“bar”
}]
}
返回{
“数据”:[{
“x”:df[df.columns[0]],
“y”:df[df.columns[1]],
“type”:“bar”
}]
}
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.run_服务器(debug=True)

我没有完整的答案,但我相信df['column\u name'].value\u counts()可能是朝着正确方向迈出的一步。这将返回uniques值及其在数据帧中的外观计数。我看到了.value_counts()函数,但不知道如何应用于图形。