Python 使用Pandas将行数据组透视到列中
我使用Pandas(Python)从CSV中读取数据作为数据帧。CSV基本上如下所示:Python 使用Pandas将行数据组透视到列中,python,csv,pandas,Python,Csv,Pandas,我使用Pandas(Python)从CSV中读取数据作为数据帧。CSV基本上如下所示: image img1.jpg date Thursday, May 5 link bit.ly/asdf subject 'Unique subject line 1' image img2.jpg date Tuesday, May 17 link bit.ly/zxcv subject 'Unique subject line 2' image img
image img1.jpg
date Thursday, May 5
link bit.ly/asdf
subject 'Unique subject line 1'
image img2.jpg
date Tuesday, May 17
link bit.ly/zxcv
subject 'Unique subject line 2'
image img3.jpg
date Monday, May 9
link bit.ly/sdfg
subject 'Unique subject line 3'
image date link subject
img1.jpg Thursday, May 5 bit.ly/asdf 'Unique subject line 1'
img2.jpg Tuesday, May 17 bit.ly/zxcv 'Unique subject line 2'
img3.jpg Monday, May 9 bit.ly/sdfg 'Unique subject line 3'
我希望将其放入一个数据框中,其中每个唯一的分组都位于一行中,当前列1中作为行数据列出的属性作为列名。因此,类似于以下内容:
image img1.jpg
date Thursday, May 5
link bit.ly/asdf
subject 'Unique subject line 1'
image img2.jpg
date Tuesday, May 17
link bit.ly/zxcv
subject 'Unique subject line 2'
image img3.jpg
date Monday, May 9
link bit.ly/sdfg
subject 'Unique subject line 3'
image date link subject
img1.jpg Thursday, May 5 bit.ly/asdf 'Unique subject line 1'
img2.jpg Tuesday, May 17 bit.ly/zxcv 'Unique subject line 2'
img3.jpg Monday, May 9 bit.ly/sdfg 'Unique subject line 3'
我尝试过使用pandas.pivot\u table,也尝试过用我想要的列创建一个空的数据框,但是使用这两种方法,我在索引或聚合方面都遇到了问题。我想这是因为我没有按任何一个属性进行分组,也没有试图聚合任何数值数据
看起来用这种方式来重塑数据应该足够简单,但我不确定如何定义我想要的分组。是否有一种方法可以使用透视表进行此操作,或者最好用另一种方法进行此操作?问题在于,由于数据当前已格式化,在透视期间没有唯一的方法对图像进行分组。在透视过程中,任何日期都可以与
img1.jpg
分组,因为没有任何附加数据表明哪个日期应该对应于每个图像
要解决这个问题,我们只需要添加一个包含分组信息的附加列。根据您的输出判断,分组基本上是按行顺序进行的;前4行放在一起,后4行放在一起,等等。要像这样枚举重复,很有用,您只需要知道图像和属性的数量。通过一些基本的数学运算,我们可以获得图像的数量和一般属性的数量:
# Add an grouping column.
nbr_images = (df['col1'] == 'image').sum()
nbr_attributes = len(df)/nbr_images
df['image_group'] = np.repeat(range(nbr_images), nbr_attributes)
现在,我们可以直接进行轴心旋转:
# Pivot the DataFrame.
pivoted_df = df.pivot(columns='col1', index='image_group', values='col2')
# Clear the index and column name.
pivoted_df.index.name = None
pivoted_df.columns.name = None
结果输出:
date image link subject
0 Thursday, May 5 img1.jpg bit.ly/asdf Unique subject line 1
1 Tuesday, May 17 img2.jpg bit.ly/zxcv Unique subject line 2
2 Monday, May 9 img3.jpg bit.ly/sdfg Unique subject line 3
我认为您可以使用创建图像组
,然后使用(新的熊猫
0.18.0
):
或者,您可以使用一行:
print pd.pivot(columns=df['col1'],
index=(df.col1 == 'image').cumsum() - 1,
values=df['col2'])
.rename_axis(None)
.rename_axis(None, axis=1)
date image link subject
0 Thursday, May 5 img1.jpg bit.ly/asdf 'Unique subject line 1'
1 Tuesday, May 17 img2.jpg bit.ly/zxcv 'Unique subject line 2'
2 Monday, May 9 img3.jpg bit.ly/sdfg 'Uniquesubject line 3'
编辑:如果原始数据帧的列为0
和1
用于选择:
print pd.pivot(columns=df.iloc[:,0],
index=(df.iloc[:,0] == 'image').cumsum() - 1,
values=df.iloc[:,1])
.rename_axis(None)
.rename_axis(None, axis=1)
date image link subject
0 Thursday, May 5 img1.jpg bit.ly/asdf 'Unique subject line 1'
1 Tuesday, May 17 img2.jpg bit.ly/zxcv 'Unique subject line 2'
2 Monday, May 9 img3.jpg bit.ly/sdfg 'Uniquesubject line 3'
太好了,谢谢!对于其他具有类似结构数据的人,我需要使用df.pivot(columns=0,values=1,index='image_group'),或者为传递给pivot的列和值参数添加名称。