pandas element wise条件返回索引

时间:2017-04-08 07:11:16

标签: pandas

我想查找异常值并将其替换为下周的相应日期。

contenteditable="true" spellcheck="true"

我可以逐列执行,代码如下:

year    week    day  v1   v2
2001    1         1  46   9999
2001    1         2  60   9335
2001    1         3 9999  9318
2001    1         4  47   9999
2001    1         5  57   9373
2001    1         6  9999 9384
2001    1         7  72   9444
2001    2         1  75    73
2001    2         2  74    63
2001    2         3  79    377
2001    2         4  70    361
2001    2         5  75    73
2001    2         6  77    64
2001    2         7  76    57

如何以元素方式整个数据帧?例如index_row=df[df['v1']==9999].index for i in index_row: df['v1'][i]=df['v1'][i+7] # i+7 is the index of next week 。 如何根据条件搜索值获取列号(名称)和行号?

目标df我想要如下: (pd.applymap表示修改后的值和下周的值)

*

2 个答案:

答案 0 :(得分:2)

在列d1上使用set_index创建['year', 'week', 'day']
使用与d2相同的索引创建d1,但从1中减去week maskother

。{
cols = ['year', 'week', 'day']
d1 = df.set_index(cols)
d2 = df.assign(week=df.week - 1).set_index(cols)
d1.mask(d1.eq(9999), d2).reset_index()

    year  week  day  v1    v2
0   2001     1    1  46    73
1   2001     1    2  60  9335
2   2001     1    3  79  9318
3   2001     1    4  47   361
4   2001     1    5  57  9373
5   2001     1    6  77  9384
6   2001     1    7  72  9444
7   2001     2    1  75    73
8   2001     2    2  74    63
9   2001     2    3  79   377
10  2001     2    4  70   361
11  2001     2    5  75    73
12  2001     2    6  77    64
13  2001     2    7  76    57

旧答案

一种方法是设置索引为d1的{​​{1}}并将其操纵为一周。然后屏蔽它等于['year', 'week', 'day']9999

fillna

答案 1 :(得分:1)

您可以使用DatetimeIndex,使用maskshift设置值:

a = df['year'].astype(str).add('-').add(df['week'].astype(str))
                          .add('-').add(df['day'].sub(1).astype(str))
#http://strftime.org/
df.index = pd.to_datetime(a, format='%Y-%U-%w')
df2 = df.shift(-1,freq='7D')
df = df.mask(df.eq(9999), df2).reset_index(drop=True)
print (df)
    year  week  day  v1    v2
0   2001     1    1  46    73
1   2001     1    2  60  9335
2   2001     1    3  79  9318
3   2001     1    4  47   361
4   2001     1    5  57  9373
5   2001     1    6  77  9384
6   2001     1    7  72  9444
7   2001     2    1  75    73
8   2001     2    2  74    63
9   2001     2    3  79   377
10  2001     2    4  70   361
11  2001     2    5  75    73
12  2001     2    6  77    64
13  2001     2    7  76    57