Python 是否仅基于数据帧中的groupby数据打印表?

Python 是否仅基于数据帧中的groupby数据打印表?,python,matplotlib,plot,pandas-groupby,Python,Matplotlib,Plot,Pandas Groupby,我最终希望将基于数据帧的“groupby”的表写入pdf文件 为了做到这一点,创建表的“绘图”似乎是实现它的一种方法 我使用下面的代码。使用print()可以很好地显示表格,但在尝试打印表格时会产生错误: "TypeError: object of type 'numpy.float64' has no len()" 我根本不知道该如何避开它。代码在“完整”数据帧上运行良好 提前谢谢 我的代码: df = pd.read_csv('Stock_holdings.csv',

我最终希望将基于数据帧的“groupby”的表写入pdf文件

为了做到这一点,创建表的“绘图”似乎是实现它的一种方法

我使用下面的代码。使用
print()
可以很好地显示表格,但在尝试打印表格时会产生错误:

"TypeError: object of type 'numpy.float64' has no len()"
我根本不知道该如何避开它。代码在“完整”数据帧上运行良好

提前谢谢

我的代码:

df = pd.read_csv('Stock_holdings.csv', delimiter=";")

df1 = df.groupby(['Valuta','Risk type 1'])["Holding"].sum()
print(df1)

fig, ax =plt.subplots(figsize=(24,4))
ax.axis('tight')
ax.axis('off')
table = ax.table(cellText=df1.values,colLabels=df1.columns,loc='center')
table.set_fontsize(24)
使用print()进行分组的结果:

下面是初始数据帧(df)-前5行

    Symbol      Virksomhed  Holding  Count Valuta  Pension  Bank Instrument  \
0      TNK  Teekay Tankers    505.0      1    USD        0  Saxo     Equity   
1     SLRC   Solar Capital    649.0      1    USD        0  Saxo     Equity   
2      FRO  Frontline NYSE   1000.0      1    USD        0  Saxo     Equity   
3      SKT          Tanger    500.0      1    USD        0  Saxo     Equity   
4  EURN.BR         Euronav   1100.0      1    EUR        0  Saxo     Equity   

  Risk type 1 Aktivklasse  
0     Tankers       Aktie  
1       Index       Aktie  
2     Tankers       Aktie  
3    Consumer       Aktie  
4     Tankers       Aktie  
你可以用。使用
.sum()
的groupby聚合返回一个系列,而plotting函数需要一个数据帧(或类似的2D字符串结构)。打印时,多索引数据框看起来类似于一个系列,因此很容易假设您为绘图生成了一个新的数据框。但是,您可能已经注意到,聚合系列的打印输出没有列名,而是在下面打印名称
Holding

from matplotlib import pyplot as plt
import pandas as pd

#fake data
import numpy as np
np.random.seed(1234)
n = 20
df = pd.DataFrame({"Valuta": np.random.choice(["DKK", "EUR", "US"], n), 
                   "Risk type 1": np.random.choice(["Consumer", "Financial", "Index", "Industrial", "Medical", "Utility"], n), 
                   "Holding": np.random.randint(100, 500, n), 
                   "Pension": np.random.randint(10, 100, n)})

df1 = df.groupby(['Valuta','Risk type 1'])["Holding"].sum().reset_index()
#print(df1)

fig, ax =plt.subplots(figsize=(8,10))
ax.axis('tight')
ax.axis('off')
my_table = ax.table(cellText=df1.values, colLabels=df1.columns, cellLoc="center", loc='center')
my_table.set_fontsize(24)
my_table.scale(1, 3)
plt.show()
样本输出:

你能告诉我们df1的结构吗?你需要将一个2d数组传递给cellText,我认为这不是一个2d数组(或列表列表)@MaxYarmolinsky。我已经添加了初始数据帧和上面groupby的结果。我认为数组/数据帧是2d的。谢谢你看一下:-)非常感谢。我确实注意到了这一点。并尝试了几种方法来命名/重命名缺少GroupByDataFrame(df1)名称(“Holding”)的列。但他无法做到这一点。但你的解决方案更像是埃莱冈。再次感谢。很高兴能帮上忙。现在您知道为什么重命名此“dataframe”的列不成功了。我们都在这里学习。
from matplotlib import pyplot as plt
import pandas as pd

#fake data
import numpy as np
np.random.seed(1234)
n = 20
df = pd.DataFrame({"Valuta": np.random.choice(["DKK", "EUR", "US"], n), 
                   "Risk type 1": np.random.choice(["Consumer", "Financial", "Index", "Industrial", "Medical", "Utility"], n), 
                   "Holding": np.random.randint(100, 500, n), 
                   "Pension": np.random.randint(10, 100, n)})

df1 = df.groupby(['Valuta','Risk type 1'])["Holding"].sum().reset_index()
#print(df1)

fig, ax =plt.subplots(figsize=(8,10))
ax.axis('tight')
ax.axis('off')
my_table = ax.table(cellText=df1.values, colLabels=df1.columns, cellLoc="center", loc='center')
my_table.set_fontsize(24)
my_table.scale(1, 3)
plt.show()