如何将熊猫系列中的值分离到字典中?

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.containscumsum 创建组。在导出为列表之前,为每个组创建一个元组列表。最后将元组列表转换为字典。

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

【讨论】:

以上是关于如何将熊猫系列中的值分离到字典中?的主要内容,如果未能解决你的问题,请参考以下文章

字典列表中的熊猫数组

将具有相同索引的熊猫系列列表转换为字典

从两个熊猫系列(csv的列作为DataFrame)创建元素字典

如何根据字典替换熊猫系列中的字符串组,并将值作为列表?

如何从表中选择熊猫系列中的值?

字典中的字典到熊猫数据框