从不同长度的二维字符串列表创建数据帧的最具Python风格/最有效的方法



我想专业的数据分析师知道这个问题的答案,但我不是分析师。我只是不太了解熊猫。所以我不知所措。

有两个列表。它们的内容是不可预测的(通过网络计数器、网络分析、网络统计等进行解析)。

list1 = ['WordA', 'WordB', ..., 'WordXYZ']

list2 = [['WordA1', 'WordA2'], ['WordB1'], ['WordC1', 'WordC2', ,'WordC96'], ..., ['WordXYZ1', 'WordXYZ2']]

两个列表的长度总是相等的(它们是我已经写过的解析器的工作结果)

我需要的是为list1中的每个项目创建一个数据帧,该数据帧将有两个行,每个行都包含第一列中的单词,然后将list2中的相应单词放入这两个行中的第一行(从第二列开始,第一列已从list1填充)。

因此,我设想以下步骤:

  1. 创建一个用空字符串('')填充的数据帧,其中列数等于len(max(list2, key=len)),行数等于list1长度的两倍(我不知道怎么做,这实际上是我第二次使用Pandas!)
  2. 以某种方式用list1的内容填充结果数据帧的第一列,为list1中的每个项填充两行
  3. 以某种方式将list2的内容放入数据帧的每偶数行,从第二列开始
  4. 保存到.xls文件中(是的,这是最终目标),享受完成的工作

现在第一件事,我已经花了半天的时间试图找到答案">如何创建用给定行数和列数的空字符串填充的panda数据帧";,并发现了许多不同的文章,它们相互矛盾。

其次,必须有一种方法来做这一切,更蟒蛇,更高效,更时尚!

Aaaand,也许有一种方法可以在不使用panda的情况下创建excel文件,我只是不知道(希望,但)

有人能帮忙吗?

UPD:(回答一个问题)结果应该是这样的:

WordA WordA1 WordA2 
WordA 
WordB WordB1 
WordB 
WordC WordC1 WordC2 (...) WordC96 
WordC 
(...)x2 
WordXYZ WordXYZ1 WordXYZ2 
WordXYZ 

如果您只想将列表写入Excel文件,则不需要panda。例如,您可以使用openpyxl:

from openpyxl import Workbook
wb = Workbook()
ws = wb.active
for *word, words in zip(list1, list2):
ws.append(word + words)
ws.append(word)
wb.save('output.xlsx')

如果您真的想使用熊猫:
import pandas as pd
df = pd.DataFrame([[None] + x if isinstance(x, list) else [x] for pair in zip(list2, list1) for x in pair])
df[0] = df[0].bfill() 
df.to_excel('output.xlsx', index=False, header=False)

以下内容应该(几乎)满足您的需求:

import pandas as pd
from itertools import chain
list1 = ['WordA', 'WordB']
list2 = [['WordA1', 'WordA2'], ['WordB1']]
# Flatten list 2
list2 = list(chain(*list2))
# Create DataFrames
list1 = pd.DataFrame(data=list1, columns=["word1"])
list2 = pd.DataFrame(data=list2, columns=["word2"])
# Prefix for list2
list2["prefix"] = list2["word2"].str.extract("([^0-9]+)")
list1 = list1.merge(list2, left_on="word1", right_on="prefix", how="inner")
# Concatenated words
list1 = list1.groupby("word1")["word2"].agg(lambda x: " ".join(x)).reset_index()
list1["word2"] = list1["word1"].str.cat(list1["word2"], sep=" ")
list1 = pd.melt(list1).sort_values(by="value")

最新更新