如何将 Python 列表转换为 pandas DataFrame :

Posted

技术标签:

【中文标题】如何将 Python 列表转换为 pandas DataFrame :【英文标题】:How to convert a Python list to into pandas DataFrame : 【发布时间】:2022-01-23 17:55:15 【问题描述】:

我已经简化了以下列表:

my_list = ['select', 'fruit1', 'fruit2, 'fruit3', 'from', 'basket1',
           'select', 'fruit4', 'from', 'basket2',
           'select', 'fruit5', 'fruit6' 'from', 'basket3', ..... so on]

请注意我的列表中的 'select''from' 语句。

我想要实现的输出是 DataFrame,或者说是 Excel 输出:

Fruit number      Basket number
fruit1            basket1
fruit2            basket1
fruit3            basket1
fruit4            basket2
fruit5            basket3
fruit6            basket3
.                 .
.                 .
.                 .
.                 .

有没有办法达到这个结果?我已经尝试了很多东西,但它不会起作用.. :(

【问题讨论】:

到目前为止您尝试过什么?我相信您必须过滤列表以删除不需要的值(选择,来自)。然后你应该找到一种方法来组织你的列表,这样你就可以“每行”一个水果。例如[['fruit1', 'basket1'], ['fruit2', 'basket1']] 在我看来,首先用 my_list 数据(如[ 'Fruit number':fruit1', 'Basket number':'basket1','Fruit number':fruit2', 'Basket number':'basket1', ... ])构造一个对象,然后将其转换为 DataFrame 是很有用的。 您的数据中除了select... from 列表之外还有其他内容吗? @mquasar 我试图在“from”的索引大于 2 的地方放置一个 while 循环,以便复制篮子.. 例如。水果 1、2 和 3 是 3 个元素,但 'from' 只有 1 个元素称为 basket1,所以我能够复制 basket1 3 次,依此类推.. 但如果我更改数据集,它效果不佳并且失败.. @Gui 任何建议都将不胜感激,因为我已经根据我的知识和谷歌尝试了很多东西,但没有任何东西能够实现我想要的输出.. :) 如果你能把它放进去代码,我也很容易理解。谢谢 【参考方案1】:

类似下面的东西(使用简单的“状态机”)

import pandas as pd
lst = ['select', 'fruit1', 'fruit2', 'fruit3', 'from', 'basket1',
       'select', 'fruit4', 'from', 'basket2',
       'select', 'fruit5', 'fruit6', 'from', 'basket3']

data = []
fruits = []
state = 'select'
for word in lst:
  if word == 'select':
    state = 'select'
    continue
  if word == 'from':
    state = 'basket'
    continue
  if state == 'select':
    fruits.append(word)
  if state == 'basket':
    for f in fruits:
      data.append('fruit':f,'basket':word)
    fruits = []

df = pd.DataFrame(data)
print(df)

输出

    fruit   basket
0  fruit1  basket1
1  fruit2  basket1
2  fruit3  basket1
3  fruit4  basket2
4  fruit5  basket3
5  fruit6  basket3

【讨论】:

elif 可以帮助摆脱continue 声明。【参考方案2】:

有很多方法可以做到这一点。这种方法获取所有“来自”的索引,并使用np.split 将前面的 2 个空格分开,以便每个新数组的开头都是一个“选择”。最后一个是空的,所以我们将其删除。

然后你可以通过分割每个数组来构建一个字典,并从中制作一个数据框。

import numpy as np
import pandas as pd
my_list = ['select', 'fruit1', 'fruit2', 'fruit3', 'from', 'basket1',
           'select', 'fruit4', 'from', 'basket2',
          'select', 'fruit5', 'fruit6', 'from', 'basket3']

f = [i+2 for i, x in enumerate(my_list) if x == "from"][:-1]
s = np.split(my_list,f)

df = pd.DataFrame(['basket':q[-1],'fruits':q[1:-2] for q in s])
df = df.explode('fruits')

输出

    basket  fruits
0  basket1  fruit1
0  basket1  fruit2
0  basket1  fruit3
1  basket2  fruit4
2  basket3  fruit5
2  basket3  fruit6

【讨论】:

【参考方案3】:
data = 'Select' : 'Fruit_Number': 
['fruit1','fruit2','fruit3'],'From' : 'Basket_Number': 
['basket1','basket2','basket3']

data2 = data['Select']
data3 = data['From']

df2 = pd.DataFrame.from_dict(data2)
df3 = pd.DataFrame.from_dict(data3)

l = [df2,df3]
df_all = pd.concat(l,axis=1)


      Fruit_Number Basket_Number
0       fruit1       basket1
1       fruit2       basket2
2       fruit3       basket3

【讨论】:

我相信转换成这种格式是他们需要帮助的。 同意!!!但这取决于数据源是否易于操作...... @B.Quinn 此方法不起作用,因为请注意应如何针对篮子 1 调用水果 1、2 和 3..然后在篮子 2 中调用水果 4,然后在篮子中调用水果 5、6 3..我无法找到解决方法.. @Chris 是的,正确.. 水果的数量应该等于篮子的数量.. 然后转换成 DataFrame..【参考方案4】:

创建一个通用且可重用的split 函数,如the ones in the answers to this question。然后更容易从每个拆分组中产生对。

def split(sequence, sep):
    group = []
    for item in sequence:
        if item == sep:
            yield group
            group = []
        else:
            group.append(item)
    yield group
    
def parse_select(tokens):
    for group in split(tokens, "select"):
        for item in group[:-2]:
            yield item, group[-1]
        
import pandas as pd
print(pd.DataFrame(parse_select(my_list)))

或者:

def parse_select(tokens):
    for group in split(tokens, "select"):
        if group:
            items, (basket,) = split(group, "from")
            for item in items:
                yield item, basket

【讨论】:

以上是关于如何将 Python 列表转换为 pandas DataFrame :的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中使用pandas将字典列表转换为数据框[重复]

如何将 Python 列表转换为 pandas DataFrame 或 excel 文件输出,具体要求如下:

如何将熊猫中的一列列表转换为Python中唯一值的稀疏DataFrame [重复]

如何将可变长度列表的 Pandas DataFrame 列(或系列)转换为固定宽度的 DataFrame [重复]

Python 如何将该列表转换成excel表格?

如何使用 PANDAS / Python 将矩阵转换为列数组