Python 使用Pandas将行数据组透视到列中

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

我使用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    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的列和值参数添加名称。