【问题标题】:How to split datas from columns and add to a list from a dataframe, also repeat the list elements for a single row? (Pandas)如何从列中拆分数据并从数据框添加到列表中,还为单行重复列表元素? (熊猫)
【发布时间】:2021-06-18 20:18:31
【问题描述】:

我有一个数据框

  Product  Photo 1  Photo 2 Photo 3 Photo 4  Price
  Shirt    a.jpg    b.jpg   c.jpg   d.jpg     100
  Pant     e.jpg                              245
  Coat     f.jpg    g.jpg                     433

列表为

values = [['A,'B','C'],['D','E','F','G'],['H','I','J','K]]

应添加这些数据框,并应从索引值[2] 开始,并且列表应根据数据框中的行数从索引开始增加。列也应该像输出格式一样被拆分。每一行的元素都应该循环。

预期输出

values = [['A,'B','C'],['D','E','F','G'],['PHOTO','a.jpg'],['PHOTO','b.jpg'],
          ['PHOTO','c.jpg'],['PHOTO','d.jpg'],['H','I','J','K],
          ['A,'B','C'],['D','E','F','G'],
          ['PHOTO','e.jpg'],['H','I','J','K], ['A,'B','C'],['D','E','F','G'], 
          ['PHOTO','f.jpg',], ['PHOTO','g.jpg'], ['H','I','J','K]
          ]

然后,我想将此列表转换为数据框。 我试过的:

L = [df.loc[:, x].set_axis(range(len(x)), axis=1) for x in values]
df = pd.concat(L).sort_index(kind='mergesort').fillna('').reset_index(drop=True)
df = df.fillna('')

前一种情况下这段代码的输出:

A  B  C  
D  E  F  G
H  I  J  K


 #the data frame repeats till the number of rows in the previous df.

【问题讨论】:

  • 我尝试理解逻辑,列表values = [['A,'B','C'],['D','E','F','G'],['H','I','J','K]] 是从同一个DataFrame 生成的?添加PHOTO的逻辑是什么?
  • 列表值来自单独的列表,'PHOTO' 是一个字符串。我想以预期列表值的格式创建一个新的数据框

标签: python python-3.x pandas dataframe numpy


【解决方案1】:

使用嵌套列表推导式添加 PHOTO 然后 values 列表:

values = [['A','B','C'],['D','E','F','G'],['H','I','J','K']]

df1 = df.fillna('').filter(like='Photo')
print (df1)
  Photo 1 Photo 2 Photo 3 Photo 4
0   a.jpg   b.jpg   c.jpg   d.jpg
1   e.jpg                        
2   f.jpg   g.jpg 


out = [y for x in df1.to_numpy() 
         for y in values[:2] + [['PHOTO', z] for z in x[x!='']] + values[2:]]
print (out)
[['A', 'B', 'C'], ['D', 'E', 'F', 'G'], ['PHOTO', 'a.jpg'], ['PHOTO', 'b.jpg'], ['PHOTO', 'c.jpg'], ['PHOTO', 'd.jpg'], ['H', 'I', 'J', 'K'], 
 ['A', 'B', 'C'], ['D', 'E', 'F', 'G'], ['PHOTO', 'e.jpg'], ['H', 'I', 'J', 'K'],
 ['A', 'B', 'C'], ['D', 'E', 'F', 'G'], ['PHOTO', 'f.jpg'], ['PHOTO', 'g.jpg'], ['H', 'I', 'J', 'K']]

【讨论】:

  • ['PHOTO', 'a.jpg', 'b.jpg', 'c.jpg', 'd.jpg'] 行应该是 ['PHOTO','a.jpg' ],['照片','b.jpg']...
  • @AtomStore - 哎呀,你是对的,我想念它。
【解决方案2】:

你可以试试这样的:

rows = [
        ['PHOTO'] + r.strip().split() 
        for r in df.filter(regex = 'Photo').to_string(header = False, index = False).split('\n')
       ]
values = values[:2] + rows + values[2:]

输出

values
[['A', 'B', 'C'], ['D', 'E', 'F', 'G'], ['PHOTO', 'a.jpg', 'b.jpg', 'c.jpg', 'd.jpg'], ['PHOTO', 'e.jpg'], ['PHOTO', 'f.jpg', 'g.jpg'], ['H', 'I', 'J', 'K']]

如果空单元格是None,那么你必须先这样做:

df = df.fillna('')

编辑后更新:

jpgs =  df.filter(regex = 'Photo').stack()
rows = [["PHOTO", jpg] for jpg in jpgs[jpgs != ''].unique()]
values = values[:2] + rows + values[2:]

输出

values
[['A', 'B', 'C'], ['D', 'E', 'F', 'G'], ['PHOTO', 'a.jpg'], ['PHOTO', 'b.jpg'], ['PHOTO', 'c.jpg'], ['PHOTO', 'd.jpg'], ['PHOTO', 'e.jpg'], ['PHOTO', 'f.jpg'], ['PHOTO', 'g.jpg'], ['H', 'I', 'J', 'K']]

【讨论】:

  • 我想添加使用标题名称,因为可能存在数据框中还有其他列的情况
  • 我已经更新了数据框。请编辑您的解决方案
  • @AtomStore 完成!
  • 请解决更新的问题。
  • @AtomStore 你不应该这样编辑问题,而是创建另一个问题
猜你喜欢
  • 2018-07-26
  • 2019-12-28
  • 1970-01-01
  • 2022-11-15
  • 2021-02-26
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
相关资源
最近更新 更多