2017-04-26 15 views
2

I가 다음 dataframe (DF) : 나는 IMP_START_TIME_BINIMP_START_TIME_BINIMP_CLR_TIME_BIN의 절대 차이 미만 IMP_CLR_TIME_BIN만큼 인에 대한 중복 행을 다음의 끝에서 (추가 할Python을 사용하여 하나의 명령에 값을 추가하고 설정하는 방법은 무엇입니까?

SERV_OR_IOR_ID IMP_START_TIME IMP_CLR_TIME IMP_START_TIME_BIN IMP_CLR_TIME_BIN 
0  -1447310116  23:59:00  00:11:00     47   0 
1  1673545041  00:00:00  00:01:00     0   0  
2  -743717696  23:59:00  00:00:00     47   0 
3  58641876  04:01:00  09:02:00     8   18 

데이터 프레임) 또는 IMP_START_TIME_BIN의 값을 증가시키면서 해당 행 아래에 추가하는 것이 바람직합니다.

예를 들어 3 행의 경우 차이가 10이므로 데이터 프레임에 10 행을 추가하여 IMP_START_TIME_BIN의 값을 8 (제외)에서 18 (포함)까지 증가시켜야합니다. 나는 다음을 수행하려고이를 위해

SERV_OR_IOR_ID IMP_START_TIME IMP_CLR_TIME IMP_START_TIME_BIN IMP_CLR_TIME_BIN 
0  -1447310116  23:59:00  00:11:00     47   0 
1  1673545041  00:00:00  00:01:00     0   0  
2  -743717696  23:59:00  00:00:00     47   0 
3  58641876  04:01:00  09:02:00     8   18 
4  58641876  04:01:00  09:02:00     9   18 
...  ...    ...   ...      ...  ... 
13  58641876  04:01:00  09:02:00     18   18 

을했지만 작동하지 않았다 :

결과는 다음과 같아야합니다 나는 그것을 어떻게

for i in range(len(df)): if df.ix[i,3] < df.ix[i,4]: for j in range(df.ix[i,3]+1, df.ix[i,4]+1): df = df.append((df.set_value(i,'IMP_START_TIME_BIN',j))*abs(df.ix[i,3] - df.ix[i,4]))

할 수 있습니까?

+0

당신은 추가 사용하여 행을 추가하려고 beacuse이 앞으로 일어날. 그러나 추가하려면 데이터 프레임이 필요합니다. 행을 새로운 데이터 프레임으로 변환 한 다음 추가하십시오. –

답변

1

당신은이 솔루션을 사용할 수 있습니다 만 필요한 인덱스 값은 고유해야합니다 :

#first filter only values for repeating 
l = df['IMP_CLR_TIME_BIN'] - df['IMP_START_TIME_BIN'] 
l = l[l > 0] 
print (l) 
3 10 
dtype: int64 

#repeat rows by repeating index values 
df1 = df.loc[np.repeat(l.index.values,l.values)].copy() 

#add counter to column IMP_START_TIME_BIN 
#better explanation http://stackoverflow.com/a/43518733/2901002 
a = pd.Series(df1.index == df1.index.to_series().shift()) 
b = a.cumsum() 
a = b.sub(b.mask(a).ffill().fillna(0).astype(int)).add(1) 
df1['IMP_START_TIME_BIN'] = df1['IMP_START_TIME_BIN'] + a.values 

#append to original df, if necessary sort 
df = df.append(df1, ignore_index=True).sort_values('SERV_OR_IOR_ID') 
print (df) 
    SERV_OR_IOR_ID IMP_START_TIME IMP_CLR_TIME IMP_START_TIME_BIN \ 
0  -1447310116  23:59:00  00:11:00     47 
1  1673545041  00:00:00  00:01:00     0 
2  -743717696  23:59:00  00:00:00     47 
3   58641876  04:01:00  09:02:00     8 
4   58641876  04:01:00  09:02:00     9 
5   58641876  04:01:00  09:02:00     10 
6   58641876  04:01:00  09:02:00     11 
7   58641876  04:01:00  09:02:00     12 
8   58641876  04:01:00  09:02:00     13 
9   58641876  04:01:00  09:02:00     14 
10  58641876  04:01:00  09:02:00     15 
11  58641876  04:01:00  09:02:00     16 
12  58641876  04:01:00  09:02:00     17 
13  58641876  04:01:00  09:02:00     18 

    IMP_CLR_TIME_BIN 
0     0 
1     0 
2     0 
3     18 
4     18 
5     18 
6     18 
7     18 
8     18 
9     18 
10    18 
11    18 
12    18 
13    18 
+0

솔루션을 사용할 때이 오류가 발생합니다. TypeError : '안전'규칙에 따라 dtype ('O')에서 dtype ('int32')으로 배열 데이터를 캐스팅 할 수 없습니다. – Shreyas

+0

'print (df.dtypes)'입니까? – jezrael

+0

dtype이 'IMP_START_TIME_BIN' 열이 int 또는 float가 아니기 때문에 나타납니다. DTYPE : – jezrael