我正在尝试使用pandas在我的数据框中添加一个包含一些值的新列,并让它重复相同的值,直到它到达索引的末尾:
我试过了:
df['Fruit Type']=['Bananas','Oranges','Strawberries']
它说:
ValueError: length of values does not match length of index
**我的索引长约8000行,因此索引与新列值的数量不匹配
我希望列看起来像:
Fruit Type:
Bananas
Oranges
Strawberries
Bananas
Oranges
Strawberries
Bananas
Oranges
Strawberries
我在一段时间后找到了解决方案:
df.insert(0, 'Fruit Type', ['Bananas', 'Oranges','Strawberries']*int(((len(df))/3)))
0代表列号,后面是列名,然后是列值。 * int ...将索引除以3并重复该值的值。 感谢@acai最后的乘数
答案 0 :(得分:3)
我们假设您的数据框长度为10个元素(并且您希望重复3个结果列表)。
>>> df
column_a
0 a
1 b
2 c
3 d
4 f
5 e
6 x
7 s
8 n
9 i
使用itertools.cycle
,您可以将列表转换为迭代器并循环直到数据帧结束:
from itertools import cycle
fruits = cycle(['Bananas','Oranges','Strawberries'])
df['Fruit_Type'] = [next(fruits) for fruit in range(len(df)]
>>> df
column_a Fruit_Type
0 a Bananas
1 b Oranges
2 c Strawberries
3 d Bananas
4 f Oranges
5 e Strawberries
6 x Bananas
7 s Oranges
8 n Strawberries
9 i Bananas
这是一个丑陋的黑客你可以用作替代方案:
您可以使用pandas.np.tile
(numpy.tile
的包装器)重复列表,但需要多次(使用//
运算符),然后只需添加列表到填充数据帧所需的n
元素:
fruits = ['Bananas','Oranges','Strawberries']
df['Fruit Type']= pd.np.tile(fruits, len(df) // len(fruits)).tolist() + fruits[:len(df)%len(fruits)]
>>> df
column_a Fruit Type
0 a Bananas
1 b Oranges
2 c Strawberries
3 d Bananas
4 f Oranges
5 e Strawberries
6 x Bananas
7 s Oranges
8 n Strawberries
9 i Bananas
答案 1 :(得分:2)
您需要重复列表,直到整数分数允许您重复自己。之后,您刚刚拥有的系列与数据帧长度的差异将是您需要从要重复的列表中添加到系列的元素数。
请考虑以下示例,其中df中有10个数据点。
df = pd.DataFrame({
'col':range(0,10)
})
list_ = ['Bananas','Oranges','Strawberries']
ser = list_ * int(len(df)/len(list_))
df['Fruit Type'] = ser + list_[:len(df)-len(ser)]
输出:
col fruit_type
0 0 Bananas
1 1 Oranges
2 2 Strawberries
3 3 Bananas
4 4 Oranges
5 5 Strawberries
6 6 Bananas
7 7 Oranges
8 8 Strawberries
9 9 Bananas