Python 打印数据帧时混合数据类型的TypeError

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

我尝试了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.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")