我有一个数据框字典。我试图计算每个数据框中的行。对于真实数据,我的代码仅对只有几行的数据帧计数超过一万行。
我尝试使用伪数据重现该错误。不幸的是,该代码可以很好地处理伪数据!
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Dataframe
Df = pd.DataFrame(np.random.randint(0,10,size=(100, 4)), columns=list('ABCD'))
# Map
Ma = Df.groupby('D')
# Dictionary of Dataframes
Di = {}
for name, group in Ma:
Di[str(name)] = group
# Count the Rows in each Dataframe
Li = []
for k in Di:
Count = Di[k].shape[0]
Li.append([Count])
# Flatten
Li_1 = []
for sublist in Li:
for item in sublist:
Li_1.append(item)
# Histogram
plt.hist(Li_1, bins=10)
plt.xlabel("Rows / Dataframe")
plt.ylabel("Frequency")
fig = plt.gcf()
答案 0 :(得分:2)
要获取与'D'
中每个类别相对应的行数,只需在执行.size
时使用groupby
:
Df.groupby('D').size()
pandas
还允许您直接绘制图形,因此您的代码可以简化为:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
Df = pd.DataFrame(np.random.randint(0,10,size=(100, 4)), columns=list('ABCD'))
Df.groupby('D').size().plot.hist()
plt.xlabel("Rows / Dataframe")
plt.ylabel("Frequency")
fig = plt.gcf()
答案 1 :(得分:1)
假定D
列中的数据是分类变量。您可以使用默认countplot
获取每个类别的计数。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Dataframe
df = pd.DataFrame(np.random.randint(0,10,size=(100, 4)), columns=list('ABCD'))
# easy count plot in sns
sns.countplot(x='D',data=df)
plt.xlabel("category")
plt.ylabel("frequency")
但是,如果要查找分布图而不是分类计数图,则可以使用代码的以下部分获得分布图。
# for distribution plot
sns.distplot(df['D'],kde=False,bins=10)
plt.xlabel("Spread")
plt.ylabel("frequency")
但是,如果要按元素分组后进行分布图,这对我来说没有任何意义,但是可以使用以下方法:
# for distribution plot after group by
sns.distplot(df.groupby('D').size() ,kde=False,bins=10)
plt.xlabel("Spread")
plt.ylabel("frequency")