我有一个列表lst
,我想将其转换为pandas数据框对象。具有字符:
的元素将被选作列名。所选元素之后的元素就是值。
lst = ['k1:', 'a1', 'a2', 'a3', 'k2:', 'b1', 'k3:', 'c1', 'c2', 'c3', 'k4:', 'd1']
我想要这个:
k1 k2 k3 k4
0 [a1, a2, a3] b1 [c1, c2, c3] d1
我们将不胜感激!
答案 0 :(得分:1)
这是使用list comprehension
,pandas
和numpy
的向量化解决方案:
# Split the list to values and columns
cols = [x[:2] for x in lst if ":" in x]
vals = [x for x in lst if ":" not in x]
print(cols)
print(vals)
['k1', 'k2', 'k3', 'k4']
['a1', 'a2', 'a3', 'b1', 'c1', 'c2', 'c3', 'd1']
从列表中创建数据框
s = pd.DataFrame(vals, columns=['values'])
s['letter'] = s['values'].str.slice(stop=1)
s = pd.DataFrame(s.groupby('letter')['values'].apply(list).reset_index(drop=True))
df = pd.DataFrame(s.to_numpy().reshape(1,4), columns=cols, index=[0])
print(df)
k1 k2 k3 k4
0 [a1, a2, a3] [b1] [c1, c2, c3] [d1]
答案 1 :(得分:1)
使用collections.defaultdict
和for
循环来重构lst
:
from collections import defaultdict
d = defaultdict(list)
for i in lst:
if ':' in i:
current_key = i
else:
d[current_key].append(i)
df = pd.DataFrame([d.values()], columns=d.keys())
[出]
k1: k2: k3: k4:
0 [a1, a2, a3] [b1] [c1, c2, c3] [d1]
答案 2 :(得分:0)
示例代码:
我首先根据值":"
中的e.g [['k1:', 'a1', 'a2', 'a3'],['k3:', 'c1', 'c2', 'c3'],....]
拆分列表,然后创建字典第1个值作为键,其余的值作为列表e.g {'k1':['a1', 'a2', 'a3'],....}
中的值。使用字典创建数据框。
import pandas as pd
lst = ['k1:', 'a1', 'a2', 'a3', 'k2:', 'b1', 'k3:', 'c1', 'c2', 'c3', 'k4:', 'd1']
#----- SPlit list based on ":" in values ----#
def group(seq, sep):
g = []
for el in seq:
if sep in str(el):
yield g
g = []
g.append(el)
yield g
result = list(group(lst, ':'))
Data = {}
for l in result:
if len(l):
key = l[0]
values = l[1:]
Data[key] = [values]
DF = pd.DataFrame.from_dict(Data)
print(DF)
输出:
k1: k2: k3: k4:
0 [a1, a2, a3] [b1] [c1, c2, c3] [d1]
答案 3 :(得分:0)
这是另一种方法:
lst = ['k1: ', 'a1', 'a2', 'a3', 'k2:', 'b1', 'k3:', 'c1', 'c2', 'c3', 'k4:', 'd1']
ret_dict = {}
last_key = None
for key in lst:
pos = key.find(':')
if pos > -1:
last_key = key[:pos]
ret_dict[last_key] = [[]]
else:
ret_dict[last_key][0].append(key)
pd.DataFrame(ret_dict)
答案 4 :(得分:0)
d = {}
temp = []
for i in lst:
if ':' in i:
if temp:
d[h] = str(temp)
temp = []
h = i.split(':')[0]
else:
temp.append(i)
d[h] = temp
pd.DataFrame(d, index=[0])
输出
k1 k2 k3 k4
0 ['a1', 'a2', 'a3'] ['b1'] ['c1', 'c2', 'c3'] d1