我有一个数据框:
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更改为另一个数字都会从列表中获取下一项,并继续为其分配值(新列)。
我迷上了算法。
答案 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