如何将 pandas 系列中的值分离到字典中?
How to separate values from pandas series into dictionary?
我有一个这样的 pandas 系列:
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
我想将项目与元素对象分开。在实际示例中,元素并非都称为 'Elements','Items' 也是如此,因此我无法将代码与命名联系起来(如包含 'elements' 和包含 'items').我需要通过字典键或数据框列来访问这些值。例如:
df['ITEMS1'] should give the first elements: Element1 to Element7.
or dict['ITEMS'] should be connected to the first 7 elements as well.
如何将元素与项目分开?
使用 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,但思路还是一样的。
你可以使用字典理解:
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_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
我有一个这样的 pandas 系列:
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
我想将项目与元素对象分开。在实际示例中,元素并非都称为 'Elements','Items' 也是如此,因此我无法将代码与命名联系起来(如包含 'elements' 和包含 'items').我需要通过字典键或数据框列来访问这些值。例如:
df['ITEMS1'] should give the first elements: Element1 to Element7.
or dict['ITEMS'] should be connected to the first 7 elements as well.
如何将元素与项目分开?
使用 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,但思路还是一样的。
你可以使用字典理解:
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_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