【问题标题】:how to transform dataframe that contains list in every row of each column如何转换每列的每一行中包含列表的数据框
【发布时间】:2019-07-01 17:52:28
【问题描述】:

我有以下dataframe,这是 for 循环的输出之一。

df = pd.DataFrame()

df['Score'] = [['0-0','1-1','2-2'],['0-0','1-1','2-2']]
df ['value'] =[[0.08,0.1,0.15],[0.07,0.12,0.06]]
df ['Team'] = ['A','B']

我想将每行列表的每个元素转换为列的每个元素。 以下是预期的输出。

谁能帮我改造一下?

谢谢,

泽普

【问题讨论】:

  • 那么score和value中的子列表总是相同的长度?

标签: python pandas dataframe transform


【解决方案1】:

使用np.concatenate

import pandas as pd 
import numpy as np 

x = [['0-0','1-1','2-2'],['0-0','1-1','2-2']]
y = [[0.08,0.1,0.15],[0.07,0.12,0.06]]
z = ['A','B']
df = pd.DataFrame()

df['Score'] = np.concatenate(x)
df ['value'] = np.concatenate(y)
df['Team'] = np.repeat(z, len(df)/len(z))
print(df)

输出:

  Score  value Team                                                                                                                          
0   0-0   0.08    A                                                                                                                          
1   1-1   0.10    A                                                                                                                          
2   2-2   0.15    A                                                                                                                          
3   0-0   0.07    B                                                                                                                          
4   1-1   0.12    B                                                                                                                          
5   2-2   0.06    B   

【讨论】:

  • 谢谢。我错过了我的问题的一部分,我只是添加了那个。可以请教吗?
  • @Zephyr 立即查看
  • 谢谢阿克谢。感谢您的帮助。
【解决方案2】:

在每个数据框列表上应用pd.Series 后,您可以尝试取消堆叠索引一次

df = pd.DataFrame()

df['Score'] = [['0-0','1-1','2-2'],['0-0','1-1','2-2']]
df ['value'] =[[0.08,0.1,0.15],[0.07,0.12,0.06]]    

df.stack().apply(pd.Series).ffill(1).unstack(level=0).T.reset_index(drop=True)

输出:

    Score   value   Team
0   0-0     0.08    A
1   0-0     0.07    B
2   1-1     0.1     A
3   1-1     0.12    B
4   2-2     0.15    A
5   2-2     0.06    B

【讨论】:

  • 如果我的第三列每行包含一个元素,该怎么办?我已经编辑了我的帖子以添加到第三列。
  • 嗨 @Zephyr 合并了更改:)
  • 感谢 Kiran,感谢您的帮助。
【解决方案3】:

您可以使用chain.from_iterable 来展平输入:

from itertools import chain

import pandas as pd

data = [['0-0','1-1','2-2'],['0-0','1-1','2-2']]
values = [[0.08,0.1,0.15],[0.07,0.12,0.06]]

df = pd.DataFrame(data=list(zip(chain.from_iterable(data), chain.from_iterable(values))), columns=['score', 'value'])
print(df)

输出

  score  value
0   0-0   0.08
1   1-1   0.10
2   2-2   0.15
3   0-0   0.07
4   1-1   0.12
5   2-2   0.06

您也可以使用np.ravel:

import numpy as np
import pandas as pd

data = [['0-0', '1-1', '2-2'], ['0-0', '1-1', '2-2']]
values = [[0.08, 0.1, 0.15], [0.07, 0.12, 0.06]]

df = pd.DataFrame({'score': np.array(data).ravel(), 'value': np.array(values).ravel()})
print(df)

【讨论】:

  • 谢谢。我错过了我的问题的一部分,我只是补充了一点。可以请教吗?
【解决方案4】:

你首先需要把ists扁平化,你可以使用itertools.chain:

from itertools import chain
score = list(chain(*[['0-0','1-1','2-2'],['0-0','1-1','2-2']]))
value = list(chain(*[[0.08,0.1,0.15],[0.07,0.12,0.06]]))

pd.DataFrame({'score':score, 'value':value})

Score  value
0   0-0   0.08
1   1-1   0.10
2   2-2   0.15
3   0-0   0.07
4   1-1   0.12
5   2-2   0.06

【讨论】:

  • 谢谢。我错过了我的问题的一部分,我只是补充了一点。可以请教吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多