Python 打印数据帧时混合数据类型的TypeError
我尝试了seaborn的基本示例,效果很好:Python 打印数据帧时混合数据类型的TypeError,python,pandas,dtype,Python,Pandas,Dtype,我尝试了seaborn的基本示例,效果很好: fig, ax = plt.subplots() sns.set(style="whitegrid") tips = sns.load_dataset("tips") sns.violinplot(ax=ax, x="day", y="total_bill", data=tips) 我尝试在我自己创建的数据帧上编写类似的内容: names = np.array(["Class 1", 'Class 2']) aa = names[np.random
fig, ax = plt.subplots()
sns.set(style="whitegrid")
tips = sns.load_dataset("tips")
sns.violinplot(ax=ax, x="day", y="total_bill", data=tips)
我尝试在我自己创建的数据帧上编写类似的内容:
names = np.array(["Class 1", 'Class 2'])
aa = names[np.random.randint(0,2,100)]
bb = np.random.uniform(0,1,100)
df = pd.DataFrame(np.array([aa, bb]).T, columns=["key", "value"])
fig, ax = plt.subplots()
sns.violinplot(ax=ax, data=df, x="key", y="value")
它抛出了一个很长的错误,结果是:
/opt/anaconda3/envs/py36nest/lib/python3.6/site-packages/numpy/core/_methods.py in _mean(a, axis, dtype, out, keepdims)
76 if isinstance(ret, mu.ndarray):
77 ret = um.true_divide(
---> 78 ret, rcount, out=ret, casting='unsafe', subok=False)
79 if is_float16_result and out is None:
80 ret = arr.dtype.type(ret)
TypeError: unsupported operand type(s) for /: 'str' and 'int'
我到底做错了什么?当我显示数据框时,它看起来是正确的
编辑:我发现,如果我以不同的方式构造数据帧,它将不会出错
df = pd.DataFrame({"key" : aa, "value" : bb})
Whyyyy???有几种方法可以解决您的问题或回答您的问题,但我将介绍三种方法 正如您所想,您的主要问题在于如何创建数据帧,特别是如何在数据帧内调用np.array,将整个数组转换为一个数据类型。正如其他用户所提到的,您可以通过使用pandas系列、列表理解或正在使用的字典格式来避免这种情况 以下每一项都适合我: 方法1:系列 方法2:列表理解 方法3:字典法 您提供的更新
就我个人而言,我发现级数方法最容易遵循,也最容易处理熊猫,但这三种方法都会产生你想要的结果。aa应该是np.random.randint0,2100吗?@Andrew我正在制作一个分类变量,它可以有两个值——1类和2类。它与seaborn示例中的分类变量一样工作。这是一种奇怪的方式,只需使用aa=np.random.choicenames,100而且,numpy数组是同质的,基本上只有1个数据类型,因此np.array[aa,bb]将该数据类型强制转换为object或str(如果您愿意的话)-包括您的随机int值。查看df.info以查看。其中,作为编辑中的dict方法,每个数组都被单独处理,一个作为对象,另一个作为intavid,在pandas中使用np.array构建数据帧时,您无法控制数据类型。另外,这与seaborn或violinplot没有任何特别的关系,你能修改标题吗?
names = np.array(["Class 1", 'Class 2'])
aa = names[np.random.randint(0,2,100)]
bb = np.random.uniform(0,1,100)
# df = pd.DataFrame(np.array([aa, bb]).T, columns=["key", "value"]) #YOUR OLD CODE
#USING SERIES (slowest but easiest to understand)
aa_series = pd.Series(aa, name = 'key') #the name of the series can turn into column names (or index names depending on method of concatenation)
bb_series = pd.Series(bb, name = 'value')
df = pd.DataFrame([aa_series,bb_series]).T #transpose to match a realistic format
fig, ax = plt.subplots()
sns.violinplot(ax=ax, data=df, x="key", y="value")
names = np.array(["Class 1", 'Class 2'])
aa = names[np.random.randint(0,2,100)]
bb = np.random.uniform(0,1,100)
# df = pd.DataFrame(np.array([aa, bb]).T, columns=["key", "value"]) #YOUR OLD CODE
#USING LIST COMPREHENSION (faster, not as easy to get)
data = [[aa[i],bb[i]] for i in range(len(aa))] #put the data into 2 cols "manually"
df = pd.DataFrame(data, columns=["key", "value"])
fig, ax = plt.subplots()
sns.violinplot(ax=ax, data=df, x="key", y="value")