我有一个大型数据框,我存储了许多冗余值,这些值使得我很难处理数据。我有一个格式的数据框:
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
我在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
名为meta
的列大约有15个以上包含大部分数据的列,我认为它不适合索引。我的想法是,我目前在meta
中存储了大量重复/冗余数据,我希望生成更紧凑的数据帧。
我找到了一些类似的Q但是无法确定我需要做什么样的操作:转动,重新索引,堆叠或拆散等等?
PS - 原始索引值对我来说并不重要。
非常感谢任何帮助。
问题我认为是相关的:
我认为以下Q与我要做的事情有关,但我看不到如何应用它,因为我不想生成更多的索引。
答案 0 :(得分:5)
如果将元列分组到列表中,则可以执行以下操作:
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
它可以帮助你完成大部分工作。额外的剪裁可以让你完成其余的工作。
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
答案 1 :(得分:4)
您可以将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
但更好的是使用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
解释,为什么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