Python 是否仅基于数据帧中的groupby数据打印表?
我最终希望将基于数据帧的“groupby”的表写入pdf文件 为了做到这一点,创建表的“绘图”似乎是实现它的一种方法 我使用下面的代码。使用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',
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()