如何使用重复值pandas(不匹配的索引)创建列

时间:2018-06-11 19:01:04

标签: python pandas

我正在尝试使用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最后的乘数

2 个答案:

答案 0 :(得分:3)

方法1:

我们假设您的数据框长度为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

方法2

这是一个丑陋的黑客你可以用作替代方案:

您可以使用pandas.np.tilenumpy.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