使用Pandas将行数据组转换为列

时间:2016-04-25 22:25:29

标签: 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    img3.jpg
date     Monday, May 9
link     bit.ly/sdfg
subject  'Unique subject line 3'

我希望将其放入一个数据框中,其中每个唯一的分组都在一行中,当前在第1列中列为行数据的属性作为列名。如下所示:

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_table,并且只使用我想要的列创建一个空数据框,但使用这两种方法时,我在索引或聚合方面遇到了问题。我认为这是因为我没有按任何一个属性进行分组,而且我没有尝试聚合任何数字数据。

看起来应该很简单以这种方式重塑数据,但我不确定如何定义我想要的分组。有没有办法使用pivot_table执行此操作,还是最好以其他方式执行此操作?

2 个答案:

答案 0 :(得分:1)

问题在于,由于当前格式化的数据,在枢轴期间没有一种独特的方式对图像进行分组。在枢轴期间,任何日期都可以与.example { transition-property: opacity; transition-duration: 2s; /* This will happen after the hover state and can also be used for consistency on the overall experience */ opacity: 0; } .example:hover { opacity: .8; transition-duration: .3s; transition-delay: .1s; } 分组,因为没有任何其他数据说明哪个日期应对应于每个图像。

要解决此问题,我们只需添加一个包含分组信息的附加列。根据您的输出判断,分组基本按行顺序排列;前4行放在一起,接下来的4行放在一起,等等。要枚举这样的重复,numpy.repeat很有用,你只需要知道图像和属性的数量。一些基本的数学运算允许我们获得一般的图像数量和属性数量:

img1.jpg

现在,它可以直接转动:

# 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

答案 1 :(得分:0)

我认为您可以使用cumsum创建image_group,然后pivot创建rename_axispandas 0.18.0中的新内容):

df['image_group'] = (df.col1 == 'image').cumsum() - 1
print df.pivot(columns='col1', index='image_group', values='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'

或者你可以使用一行:

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'

编辑:如果原始DataFrame的列为01使用iloc进行选择:

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'