Pandas中使用loc将列表等集合赋值给行或列的每一个元素

版权声明:本文为博主在工作学习中总结而来,转载请注明出处。 https://blog.csdn.net/wj1066/article/details/81510508

0.背景

在使用Pandas进行数据处理过程当中,有时候需要将数据的某一列都赋值为某一个列表的形式。但是如果列的元素个数与列表的元素个数相同时赋值,会导致列表中的每一个元素对应到了列的一个表格中(详情见下)。本文即解决这样的问题。

1.对应赋值

import pandas as pd
import numpy as np

data = pd.DataFrame({"A":np.arange(5), "B": list("abcde")})
myList = ('w', 'j')
data.head()

# 原始数据
# A	B
# 0	0	a
# 1	1	b
# 2	2	c
# 3	3	d
# 4	4	e

# 每个单元格对应列表中的一个元素
data.loc[data.A >= 2, 'A'] = ('P', 'P', 'P')
data.head()

# 	A	B
# 0	0	a
# 1	1	b
# 2	P	c
# 3	P	d
# 4	P	e

在这种情况下,如果这一列元素的个数和列表中元素的个数不相符,会报出ValueError: Must have equal len keys and value when setting with an iterable

2.赋值一个列表,使用frozenset(仅适用于不包含重复元素的情况),因为set会去除重复元素。

data.loc[data.A == 'P', 'A'] = frozenset((1,2,3))
data.head()

# 	A	B
# 0	0	a
# 1	1	b
# 2	(1, 2, 3)	c
# 3	(1, 2, 3)	d
# 4	(1, 2, 3)	e

frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。

class frozenset([iterable])
参数:
iterable -- 可迭代的对象,比如列表、字典、元组等等。
返回值:
返回新的 frozenset 对象,如果不提供任何参数,默认会生成空集合。

更多关于frozenset,参见:http://www.runoob.com/python/python-func-frozenset.html

3.更好的方法

最好将list或者tuple转换成字符串,然后后续利用进行分割处理。

猜你喜欢

转载自blog.csdn.net/wj1066/article/details/81510508