【问题标题】:How do I turn a Pandas DataFrame into a Discord Embed?如何将 Pandas DataFrame 转换为 Discord Embed?
【发布时间】:2021-06-07 14:30:32
【问题描述】:

我目前正在开发一个 Discord Bot,它从 Google 电子表格中获取数据并将其转换为 Pandas DataFrame。使用所述 DataFrame,Bot 然后输出用户要求的特定数据。 电子表格如下所示: 名称 |氏族 |国家 |注释(这些是列,行中是大约 1000 名游戏玩家的相应信息)。 我在完整的基础上创建了几个不同的 DataFrame:

# Fields
fields_with_clan = ['Name', 'Clan']
fields_just_name = ['Name']
fields_with_country = ['Name', 'Country']
fields_fullinfo = ['Name', 'Clan', 'Country']
fields_countries_only = ['Country']

# Respective DataFrames for each field
df = pd.read_csv(f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv")
df_players_clans = pd.read_csv(f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv",
                               usecols=fields_with_clan)
df_players = pd.read_csv(f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv",
                         usecols=fields_just_name)
df_players_countries = pd.read_csv(f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv",
                                   usecols=fields_with_country)
df_players_fullinfo = pd.read_csv(f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv",
                                  usecols=fields_fullinfo)
df_countries_only = pd.read_csv(f"https://docs.google.com/spreadsheets/d/{sheet_id}/export?format=csv",
                                usecols=fields_countries_only)

我还创建了一个字典,将氏族的常用拼写(缩写)翻译成电子表格中使用的完整名称:

Dict_Clans = {'zt': 'Zero Tolerance - ƵŦ✿', 'kaveh': 'Kaveh - :K', 'dw': 'Deadly Warriors - Ðฬ',
              'nf': 'Next Force - NF', ... }

现在,机器人的一个功能是使用以下代码输出 Clan 的每个成员:

# List all members of given clan
@client.command(name='members')
async def members(context, *, index: str):
    if df_players[df_players_clans.values == [Dict_Clans.get(index)]].empty != True:
        await context.message.channel.send(df_players[df_players_clans.values == [Dict_Clans.get(index)]])
    else:
        await context.message.channel.send("Unfortunately, we don't have '" + index + "' in our Database.")

这行得通;例如如果用户键入“?members zt”,Bot 会输出一个 DataFrame,其中包含所有属于 ZT 部落的玩家。 问题是,它在 Discord 上看起来不太漂亮。 我希望将 DataFrame 作为 Discord Embed 输出,其标题是每个玩家的名称。 我在想最聪明的方法可能是 while 函数,但我似乎无法正确实现它。

提前感谢您的回答。

【问题讨论】:

    标签: python pandas discord


    【解决方案1】:

    有点晚了,但希望这会有所帮助。

    pip 安装散景

    下载 geckodriver 和 chormedriver 并将它们的路径添加到您的环境变量中

    然后尝试将数据框转换为 png。

    from bokeh.io import export_png, export_svgs
    from bokeh.models import ColumnDataSource, DataTable, TableColumn
    
    def load_from_gspreadsheet(sheet_name, key):
        url = 'https://docs.google.com/spreadsheets/d/{key}/gviz/tq?tqx=out:csv&sheet={sheet_name}&headers=1'.format(
            key=key, sheet_name=sheet_name.replace(' ', '%20'))
    
    
    def save_df_as_image(df, path):
        source = ColumnDataSource(df)
        df_columns = [df.index.name]
        df_columns.extend(df.columns.values)
        columns_for_table=[]
        print(df_columns)
        for column in df_columns:
            if column != None:
                columns_for_table.append(TableColumn(field=column, title=column))
    
        data_table = DataTable(source=source, columns=columns_for_table,height_policy="auto",width_policy="auto",index_position=None)
        export_png(data_table, filename = path)
    
    
    @bot.command()
    async def fetch(ctx):
           df = load_from_gspreadsheet(sheet_name, spreadsheet_id)
           pt = os.getcwd()
           save_df_as_image(df, os.path.join(pt,'plot.png'))
           file=discord.File('plot.png')
           e = discord.Embed()
           e.set_image(url="attachment://plot.png")
           # await ctx.send(file=discord.File('plot.png'))
           await ctx.send(file = file, embed = e)```
    
     
    

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 2013-05-25
      • 2022-09-29
      • 2017-03-17
      • 2017-03-23
      • 2017-07-14
      • 2019-06-04
      • 2017-04-13
      • 2021-03-29
      相关资源
      最近更新 更多