基于现有python pandas列的新数据帧

时间:2017-03-08 12:09:54

标签: python pandas dataframe

我正在尝试根据列类别(A,B和C)中的分类值从现有数据帧df创建新的数据帧df_A,df_B和df_C。

这不起作用

df_A = {n: df.ix[rows] 
 for n, rows in enumerate(df.groupby('Category').groups)}

这里我收到错误“Key Error:A”

(注:A是其中一个类别)

这不起作用

df_A = np.where(df['Category']=='A')).copy()

这里我收到错误:“语法错误”

最后,这不起作用

df_A = np.where(raw[raw['Category']=='A']).copy()

“AttributeError:'tuple'对象没有属性'copy'”

谢谢

1 个答案:

答案 0 :(得分:1)

您似乎首先需要boolean indexing,因为Category是列,而不是index,如果需要字典:

df2 = {n: data[ data['Category'] == rows] 
           for n, rows in enumerate(data.groupby('Category').groups)}

或尝试删除groups

df2 = {n: rows[1] for n, rows in enumerate(data.groupby('Category'))}

样品:

data = pd.DataFrame({'Category':['A','A','D'],
                   'B':[4,5,6],
                   'C':[7,8,9]})

print (data)
   B  C Category
0  4  7        A
1  5  8        A
2  6  9        D

df2 = {n: rows[1] for n, rows in enumerate(data.groupby('Category'))}
print (df2)
{0:    B  C Category
0  4  7        A
1  5  8        A, 1:    B  C Category
2  6  9        D}

df2 = {n: data[ data['Category'] == rows] 
           for n, rows in enumerate(data.groupby('Category').groups)}
print (df2)
{0:    B  C Category
0  4  7        A
1  5  8        A, 1:    B  C Category
2  6  9        D}

没有groupby

的解决方案
df2 = {n: data[data['Category'] == rows] for n, rows in enumerate(data['Category'].unique())}
print (df2)
{0:    B  C Category
0  4  7        A
1  5  8        A, 1:    B  C Category
2  6  9        D}
print (df2[0])
   B  C Category
0  4  7        A
1  5  8        A

但如果需要按DataFrame值选择Category的词典:

dfs = {n: rows for n, rows in data.groupby('Category')}
print (dfs)
{'A':    B  C Category
0  4  7        A
1  5  8        A, 'D':    B  C Category
2  6  9        D}

print (dfs['A'])
   B  C Category
0  4  7        A
1  5  8        A