我想专业的数据分析师知道这个问题的答案,但我不是分析师。我只是不太了解熊猫。所以我不知所措。
有两个列表。它们的内容是不可预测的(通过网络计数器、网络分析、网络统计等进行解析)。
list1 = ['WordA', 'WordB', ..., 'WordXYZ']
和
list2 = [['WordA1', 'WordA2'], ['WordB1'], ['WordC1', 'WordC2', ,'WordC96'], ..., ['WordXYZ1', 'WordXYZ2']]
两个列表的长度总是相等的(它们是我已经写过的解析器的工作结果)
我需要的是为list1
中的每个项目创建一个数据帧,该数据帧将有两个行,每个行都包含第一列中的单词,然后将list2
中的相应单词放入这两个行中的第一行(从第二列开始,第一列已从list1
填充)。
因此,我设想以下步骤:
- 创建一个用空字符串('')填充的数据帧,其中列数等于
len(max(list2, key=len))
,行数等于list1
长度的两倍(我不知道怎么做,这实际上是我第二次使用Pandas!) - 以某种方式用
list1
的内容填充结果数据帧的第一列,为list1
中的每个项填充两行 - 以某种方式将
list2
的内容放入数据帧的每偶数行,从第二列开始 - 保存到.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")