oli*_*rsm 8 python dataframe pandas
我有一个很大的数据框,并且我存储了很多冗余值,这些值使处理数据变得困难。我有一个形式的数据框:
import pandas as pd
df = pd.DataFrame([["a","g","n1","y1"], ["a","g","n2","y2"], ["b","h","n1","y3"], ["b","h","n2","y4"]], columns=["meta1", "meta2", "name", "data"])
>>> df
meta1 meta2 name data
a g n1 y1
a g n2 y2
b h n1 y3
b h n2 y4
Run Code Online (Sandbox Code Playgroud)
我在其中输入了想要的新列的名称,name并在中输入了相应的数据data。
我想产生一个形式的数据框:
df = pd.DataFrame([["a","g","y1","y2"], ["b","h","y3","y4"]], columns=["meta1", "meta2", "n1", "n2"])
>>> df
meta1 meta2 n1 n2
a g y1 y2
b h y3 y4
Run Code Online (Sandbox Code Playgroud)
所调用meta的列是包含大多数数据的其他15列以上的列,我认为这不是特别适合索引的。我的想法是,目前我存储了很多重复/冗余的数据meta,我想产生一个更紧凑的数据框。
我发现了一些类似的问题,但无法指出我需要执行哪种操作:数据透视,重新索引,堆栈或拆栈等。
PS-原始索引值对我而言并不重要。
任何帮助将非常感激。
我认为相关的问题:
我认为以下问题与我要执行的操作有关,但是我不知道如何应用它,因为我不想产生更多的索引。
如果将元列分组到列表中,则可以执行以下操作:
metas = ['meta1', 'meta2']
new_df = df.set_index(['name'] + metas).unstack('name')
print new_df
data
name n1 n2
meta1 meta2
a g y1 y2
b h y3 y4
Run Code Online (Sandbox Code Playgroud)
这可以帮助您实现大部分目标。额外的剪裁可以帮助您完成其余所有工作。
print new_df.data.rename_axis([None], axis=1).reset_index()
meta1 meta2 n1 n2
0 a g y1 y2
1 b h y3 y4
Run Code Online (Sandbox Code Playgroud)
您可以将pivot_table和reset_index和rename_axis(新增pandas 0.18.0)一起使用:
print (df.pivot_table(index=['meta1','meta2'],
columns='name',
values='data',
aggfunc='first')
.reset_index()
.rename_axis(None, axis=1))
meta1 meta2 n1 n2
0 a g y1 y2
1 b h y3 y4
Run Code Online (Sandbox Code Playgroud)
但更好的是使用aggfunc join:
print (df.pivot_table(index=['meta1','meta2'],
columns='name',
values='data',
aggfunc=', '.join)
.reset_index()
.rename_axis(None, axis=1))
meta1 meta2 n1 n2
0 a g y1 y2
1 b h y3 y4
Run Code Online (Sandbox Code Playgroud)
解释,为什么join通常更好为first:
如果使用first,您可能会丢失所有不是每个组中第一个数据的数据index,而是join将其合并:
import pandas as pd
df = pd.DataFrame([["a","g","n1","y1"],
["a","g","n2","y2"],
["a","g","n1","y3"],
["b","h","n2","y4"]], columns=["meta1", "meta2", "name", "data"])
print (df)
meta1 meta2 name data
0 a g n1 y1
1 a g n2 y2
2 a g n1 y3
3 b h n2 y4
print (df.pivot_table(index=['meta1','meta2'],
columns='name',
values='data',
aggfunc='first')
.reset_index()
.rename_axis(None, axis=1))
meta1 meta2 n1 n2
0 a g y1 y2
1 b h None y4
print (df.pivot_table(index=['meta1','meta2'],
columns='name',
values='data',
aggfunc=', '.join)
.reset_index()
.rename_axis(None, axis=1))
meta1 meta2 n1 n2
0 a g y1, y3 y2
1 b h None y4
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6819 次 |
| 最近记录: |