python - 重新格式化熊猫数据框
问题描述
我已经研究了一段时间我有看起来像这样的数据框
tables columns
tab1 col001
tab1 col002
tab1 col003
tab2 col01
tab2 col02
tab2 col03
真正的有 1500 个表,一些列名是重复的,整个东西是 80,000 行乘 2 列,我试图让它像这样格式化
tables columns
tab1 col001,col002,col003
tab2 col01,col02,col03
我尝试了这样的交叉表
cross_table = pd.crosstab(df['tables'],
df['columns']).fillna('n/a')
但这并不完全是我想要的,它最终将所有列都作为 1 和 0,并且是一个大的稀疏矩阵
我也试过这个,但是分配 2 GiB 的错误让我觉得这是不正确的
df.pivot(columns=['tables', 'columns'], values=['columns'])
我也试过 pandas melt 但这似乎也不对
然后我尝试将列转换为这样的列表
cols = list(df['columns'].unique())
df['cols'] = df['columns'].str.findall(f'({"|".join(cols)})')
我试过了,因为它以前用于提取文本,但在不同的上下文中,因为它只是将每个列名拆分为单个字符
解决方案
设置:
df = pd.DataFrame({'tables': {0: 'tab1', 1: 'tab1', 2: 'tab1', 3: 'tab2', 4: 'tab2', 5: 'tab2'},
'columns': {0: 'col001',
1: 'col002',
2: 'col003',
3: 'col01',
4: 'col02',
5: 'col03'}})
1. 通过groupby
:
df = df.groupby('tables').agg(', '.join).reset_index() # Almost same as the answer in the post's comment section via @Psidom
2. 通过pivot_table
:
df = df.pivot_table(index = 'tables', values = 'columns', aggfunc = ', '.join).reset_index()
3. 通过list comprehension
:
df = pd.DataFrame([(i, ', '.join(df[df['tables'] == i]['columns']))
for i in df['tables'].unique()], columns=df.columns)
4.Set_index/unstack
选项:
df = df.set_index('tables', append = True).unstack(0).apply(lambda x: ', '.join(x.dropna()), 1).reset_index(name = 'columns')
5.通过pd.get_dummies
df = pd.get_dummies(df.tables).mul(df['columns'], 0).agg(', '.join).str.strip(
', ').reset_index(name='columns').rename({'index': 'tables'})
输出:
tables columns
0 tab1 col001, col002, col003
1 tab2 col01, col02, col03
推荐阅读
- c - 找不到用于 FFmpeg 转码的 x264 编解码器设备
- google-analytics - 通过将 BigQuery 链接到 Google Analytics 来回填数据是否需要付费?
- c - 将内存分配给不同的结构会更改完全不同的结构的指针成员
- c# - 如何在 ASP Web 表单的 GridView 中的特定单元格中添加 TextBox?
- python - Pycharm 问题:无论如何,我可以在使用 CTRL+LEFT CLICK 搜索定义等后返回吗?
- mysql - Mysql:对多条记录应用条件
- c# - 如何使用c#滚动Winapp驱动程序中的下拉和列表框等区域?
- html - 如何更改引导 4 网格中的偏移大小?
- java - 检查 Java \$ 或 \ 中的一组特定元字符,
- maxmind - MaxMind Geolite2-City 不显示城市和地区信息