如何将熊猫系列中的值分离到字典中?
Posted
技术标签:
【中文标题】如何将熊猫系列中的值分离到字典中?【英文标题】:How to separate values from pandas series into dictionary? 【发布时间】:2021-12-02 20:32:00 【问题描述】:我有一个这样的熊猫系列:
LIST 0 ITEM1
1 Element1
2 Element2
3 Element3
4 Element4
5 Element5
6 Element6
7 Element7
8 ITEM2
9 Element8
10 ELEMENT9
11 ELEMENT10
12 Element11
13 Element12
14 Element13
15 Element14
16 Element2
17 Element24
18 Element25
19 Element26
20 ITEM3
21 Element28
Name: Items, dtype: object
我想将项目与元素对象分开。在实际示例中,元素并非全部称为“元素”,“项目”也是如此,因此我无法将代码连接到命名(如包含“元素”和“项目”)。我需要通过字典键或数据框列访问值。例如:
df['ITEMS1'] should give the first elements: Element1 to Element7.
or dict['ITEMS'] should be connected to the first 7 elements as well.
如何将元素与项目分开?
【问题讨论】:
您的预期输出是什么?你的意思是'Element': ['Element1', 'Element2', ...], 'ITEM': ['ITEM2', 'ITEM3']
我需要:'ITEM1': ['Element1', 'Element2', ...,'Element7'], 'ITEM2': ['Element8', 'Element9'...]
【参考方案1】:
使用str.contains
和cumsum
创建组。在导出为列表之前,为每个组创建一个元组列表。最后将元组列表转换为字典。
d = dict(df.groupby(df['LIST'].str.contains('^ITEM').cumsum())['LIST'] \
.apply(lambda x: (x.iloc[0], x.iloc[1:].tolist())).tolist())
print(d)
# Output:
'ITEM1': ['Element1',
'Element2',
'Element3',
'Element4',
'Element5',
'Element6',
'Element7'],
'ITEM2': ['Element8',
'ELEMENT9',
'ELEMENT10',
'Element11',
'Element12',
'Element13',
'Element14',
'Element2',
'Element24',
'Element25',
'Element26'],
'ITEM3': ['Element28']
注意:您必须找到一种方法来区分 Item 和 Element,但想法保持不变。
【讨论】:
【参考方案2】:你可以使用dict理解:
print (i.iloc[0]: i.iloc[1:].tolist() for _, i in df.groupby(df["Items"].str.startswith("ITEM").cumsum())["Items"])
'ITEM1': ['Element1', 'Element2', 'Element3', 'Element4', 'Element5', 'Element6', 'Element7'],
'ITEM2': ['Element8', 'ELEMENT9', 'ELEMENT10', 'Element11', 'Element12', 'Element13', 'Element14',
'Element2', 'Element24', 'Element25', 'Element26'],
'ITEM3': ['Element28']
【讨论】:
我可以创建一个包含所有项目的列表,而不是以“ITEM”开头的列表,例如 items=['ITEM1','ITEM2'...] 并检查该项目是否在该列表中?如果是这样,怎么做? 使用df["Items"].isin(items)
。
非常感谢!只是想知道,“cumsum”在这里做什么?
它通过对布尔系列求和来创建一个组号。【参考方案3】:
你也可以使用:
item_index = df[df["col"].str.startswith("ITEM")].index.to_list()
data = np.split(df['col'].to_numpy(), item_index)
df = pd.DataFrame(data[1:]).set_index(0).T
输出:
0 ITEM1 ITEM2 ITEM3
1 Element1 Element8 Element28
2 Element2 ELEMENT9 None
3 Element3 ELEMENT10 None
4 Element4 Element11 None
5 Element5 Element12 None
6 Element6 Element13 None
7 Element7 Element14 None
8 None Element2 None
9 None Element24 None
10 None Element25 None
11 None Element26 None
【讨论】:
以上是关于如何将熊猫系列中的值分离到字典中?的主要内容,如果未能解决你的问题,请参考以下文章