熊猫随着进展的条件价值

时间:2019-11-19 16:02:24

标签: python pandas algorithm loops iterator

我有一个数据框:

           store_id    period   sales    t
512944     38126926    241    3.9500    1.0
832513     38126935    240    0.9500    1.0
417892     38126935    242    4.6500    2.0
354468     38126938    241    5.1000    1.0
604276     38126938    242    3.2765    1.0

我需要从上到下进行迭代,并从列表中递归地分配值。列'T'中的每个时间值从1> 2更改,我需要从列表中获取下一个值。

例如:

if value in COLUMN 'T' is 1:
    then use first item from a list
if value in COLUMN 'T' is more then 1:
    then use NEXT item from the list

因此,列'T'中的每个时间值从1更改为另一个数字都会从列表中获取下一项,并继续为其分配值(新列)。

我迷上了算法。

3 个答案:

答案 0 :(得分:1)

这是一个建议:

方法1:

首先从您的值列表创建一个字典。假设您的值列表称为my_list

my_list = ['just', 'some', 'values']
mapping = {key: val for key, val in enumerate(my_list)}

现在,您可以按如下所示将值分配给列list_val

df['list_val'] = df.t.eq(2).cumsum().map(mapping)

方法2:

或者,您也可以执行以下操作,而无需创建mapping

df['list_val'] = df.t.eq(2).cumsum().apply(lambda x: my_list[x])

现在df如下所示:

        store_id  period   sales    t list_val
512944  38126926     241  3.9500  1.0     just
832513  38126935     240  0.9500  1.0     just
417892  38126935     242  4.6500  2.0     some
354468  38126938     241  5.1000  1.0     some
604276  38126938     242  3.2765  1.0     some

答案 1 :(得分:0)

如果我理解正确:如果我们将您的数据框称为df,并将列表称为value_list 然后,我们可以做这样的事情

# create column with all values as first element of list 
df['new_col'] = value_list[0]

# get boolean vector for filtering the dataframe
df_filter = df['t'] != 1 

# reduce the list so we only have the elements that we would use
value_list = value_list[1:sum(df_filter)]

# reassign the values of `new_col` with value_list
df.loc[df_filter, 'new_col'] = value_list

现在,列new_col应该具有您所需要的。

如果我误解了,而您的问题仅需要包含两个元素的列表,则应将重新分配行更改为

df.loc[df_filter, 'new_col'] = value_list[1]

不向下过滤value_list

答案 2 :(得分:0)

首先让我们读取数据:

from io import StringIO
import pandas as pd

s = """           store_id    period   sales    t
512944     38126926    241    3.9500    1.0
832513     38126935    240    0.9500    1.0
417892     38126935    242    4.6500    2.0
354468     38126938    241    5.1000    1.0
604276     38126938    242    3.2765    1.0"""

df = pd.read_csv(StringIO(s), sep='\s+')

我认为这是您所需要的:


i = 0
mylist = [4, 5]
for ix, row in df.iterrows():
    if row.t == 1:
        df.loc[ix, 'newcol'] = mylist[0]
    else:
        i += 1
        df.loc[ix, 'newcol'] = mylist[i]
print(df)
        store_id  period   sales    t  newcol
512944  38126926     241  3.9500  1.0     4.0
832513  38126935     240  0.9500  1.0     4.0
417892  38126935     242  4.6500  2.0     5.0
354468  38126938     241  5.1000  1.0     4.0
604276  38126938     242  3.2765  1.0     4.0