在 Pandas 列内拆分 dictionary/list 并转换为新数据框
Splitting dictionary/list inside a Pandas Column and convert as new dataframe
我将数据保存在 excel 中。我正在使用 Python2.7 查询此数据并将其转换为 Pandas DataFrame。我的 dataframe.It 中有一个名为 category 的列,其中有一个值的字典(或列表?)。 DataFrame 如下所示:
[1] df
ID CATEGORY
1 {60: 'SHOES'}
2 {46: 'HARDWARE'}
3 {60: 'SHOES'}
4 {219: 'GOVERNMENT OFFICE'}
5 {87: 'ARCADES',60: 'SHOES'}
我需要将此列拆分为单独的列,以便 DataFrame 如下所示:
[2] df2
CATEGORY_ID CATEGORY_NAME
60 SHOES
46 HARDWARE
219 GOVERNMENT OFFICE
87 ARCADES
我需要在我的数据框中添加一个新列
[3] df
ID CATEGORY_id
1 60
2 46
3 60
4 219
5 87,60
任何人都请帮助我..
我认为你需要:
ast
用于将 string
s 转换为 dictionaries
- 重塑
stack
- 通过
reset_index
将index
转换为列
- 通过
drop_duplicates
删除重复项
import ast
df = (pd.DataFrame(df['CATEGORY'].apply(ast.literal_eval).values.tolist())
.stack()
.reset_index(level=0, drop=True)
.reset_index()
.drop_duplicates()
.rename(columns={'index':'CATEGORY_ID', 0:'CATEGORY_NAME'}))
print (df)
CATEGORY_ID CATEGORY_NAME
0 60 SHOES
1 46 HARDWARE
3 219 GOVERNMENT OFFICE
5 87 ARCADES
编辑:解决方案有点简化,为了加入重复项 CATEGORY_ID
使用 groupby
和 join
:
import ast
df = (pd.DataFrame(df['CATEGORY'].apply(ast.literal_eval).values.tolist(), index=df['ID'])
.stack()
.reset_index()
.rename(columns={'level_1':'CATEGORY_ID', 0:'CATEGORY_NAME'})
)
print (df)
ID CATEGORY_ID CATEGORY_NAME
0 1 60 SHOES
1 2 46 HARDWARE
2 3 60 SHOES
3 4 219 GOVERNMENT OFFICE
4 5 60 SHOES
5 5 87 ARCADES
df1 = df.groupby('ID')['CATEGORY_ID'].apply(lambda x: ', '.join(x.astype(str))).reset_index()
print (df1)
ID CATEGORY_ID
0 1 60
1 2 46
2 3 60
3 4 219
4 5 60, 87
我将数据保存在 excel 中。我正在使用 Python2.7 查询此数据并将其转换为 Pandas DataFrame。我的 dataframe.It 中有一个名为 category 的列,其中有一个值的字典(或列表?)。 DataFrame 如下所示:
[1] df
ID CATEGORY
1 {60: 'SHOES'}
2 {46: 'HARDWARE'}
3 {60: 'SHOES'}
4 {219: 'GOVERNMENT OFFICE'}
5 {87: 'ARCADES',60: 'SHOES'}
我需要将此列拆分为单独的列,以便 DataFrame 如下所示:
[2] df2
CATEGORY_ID CATEGORY_NAME
60 SHOES
46 HARDWARE
219 GOVERNMENT OFFICE
87 ARCADES
我需要在我的数据框中添加一个新列
[3] df
ID CATEGORY_id
1 60
2 46
3 60
4 219
5 87,60
任何人都请帮助我..
我认为你需要:
ast
用于将string
s 转换为dictionaries
- 重塑
stack
- 通过
reset_index
将 - 通过
drop_duplicates
删除重复项
index
转换为列
import ast
df = (pd.DataFrame(df['CATEGORY'].apply(ast.literal_eval).values.tolist())
.stack()
.reset_index(level=0, drop=True)
.reset_index()
.drop_duplicates()
.rename(columns={'index':'CATEGORY_ID', 0:'CATEGORY_NAME'}))
print (df)
CATEGORY_ID CATEGORY_NAME
0 60 SHOES
1 46 HARDWARE
3 219 GOVERNMENT OFFICE
5 87 ARCADES
编辑:解决方案有点简化,为了加入重复项 CATEGORY_ID
使用 groupby
和 join
:
import ast
df = (pd.DataFrame(df['CATEGORY'].apply(ast.literal_eval).values.tolist(), index=df['ID'])
.stack()
.reset_index()
.rename(columns={'level_1':'CATEGORY_ID', 0:'CATEGORY_NAME'})
)
print (df)
ID CATEGORY_ID CATEGORY_NAME
0 1 60 SHOES
1 2 46 HARDWARE
2 3 60 SHOES
3 4 219 GOVERNMENT OFFICE
4 5 60 SHOES
5 5 87 ARCADES
df1 = df.groupby('ID')['CATEGORY_ID'].apply(lambda x: ', '.join(x.astype(str))).reset_index()
print (df1)
ID CATEGORY_ID
0 1 60
1 2 46
2 3 60
3 4 219
4 5 60, 87