我有一个仅具有以下两行的csv文件:
ID CODE DATE STARTDATE AVERAGE1 AGGREGATE MEDIAN1 MEDIAN2 AVERAGE2 AVERAGE3 POSITION
123 112 2016OCT25 2016OCT25 821 3 1021 4000 172 183 S8
124 111 2016OCT25 2016OCT25 834 3 1025 4210 173 185 ENG
position列采用S1-S8和T1-T8的值(总共16个)。我想创建一个如下所示的数据框:
AVERAGE1 MEDIAN1 MEDIAN2 AVERAGE2 AVERAGE3 POSITION
S1
S2
S3
S4
S5
S6
S7
S8
T1
T2
T3
T4
T5
T6
T7
T8
现在的问题是,如果csv文件中的“ POSITION”列读取为“ ENG”,则必须为数据帧中所有位置(从S1-T8开始)填充列数据中相同的对应数据。如果它读取任何特定位置,例如上方第二列中的S8,则必须将csv中该列中的数据填充到数据帧中的相应POSITION。为了更清楚一点,输出应如下所示:
AVERAGE1 MEDIAN1 MEDIAN2 AVERAGE2 AVERAGE3 POSITION
821 1021 4000 172 183 S1
821 1021 4000 172 183 S2
821 1021 4000 172 183 S3
821 1021 4000 172 183 S4
821 1021 4000 172 183 S5
821 1021 4000 172 183 S6
821 1021 4000 172 183 S7
834 1025 4210 173 185 S8
821 1021 4000 172 183 T1
821 1021 4000 172 183 T2
821 1021 4000 172 183 T3
821 1021 4000 172 183 T4
821 1021 4000 172 183 T5
821 1021 4000 172 183 T6
821 1021 4000 172 183 T7
821 1021 4000 172 183 T8
我通过创建一个空的数据框并在读取csv后用df.iloc填充了单元格来完成此操作。任何效率更高或Pythonic的方法将不胜感激。提前致谢!
最佳答案
我认为您可以在reindex
列中使用pos
,在fillna
列中使用ENG
,在POSITION
列中使用drop
,将int
放在不必要的列中,并强制转换为reset_index
,最后使用:
pos = ['S' + str(x) for x in range(1, 9)] + ['T' + str(x) for x in range(1,9)]
print (pos)
['S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7', 'S8',
'T1', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7', 'T8']
df.set_index('POSITION', inplace=True)
print (df.reindex(pos).fillna(df.ix['ENG']))
ID CODE DATE STARTDATE AVERAGE1 AGGREGATE MEDIAN1 \
POSITION
S1 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
S2 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
S3 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
S4 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
S5 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
S6 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
S7 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
S8 123.0 112.0 2016OCT25 2016OCT25 821.0 3.0 1021.0
T1 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
T2 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
T3 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
T4 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
T5 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
T6 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
T7 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
T8 124.0 111.0 2016OCT25 2016OCT25 834.0 3.0 1025.0
MEDIAN2 AVERAGE2 AVERAGE3
POSITION
S1 4210.0 173.0 185.0
S2 4210.0 173.0 185.0
S3 4210.0 173.0 185.0
S4 4210.0 173.0 185.0
S5 4210.0 173.0 185.0
S6 4210.0 173.0 185.0
S7 4210.0 173.0 185.0
S8 4000.0 172.0 183.0
T1 4210.0 173.0 185.0
T2 4210.0 173.0 185.0
T3 4210.0 173.0 185.0
T4 4210.0 173.0 185.0
T5 4210.0 173.0 185.0
T6 4210.0 173.0 185.0
T7 4210.0 173.0 185.0
T8 4210.0 173.0 185.0
df = df.reindex(pos)
.fillna(df.ix['ENG'])
.drop(['ID','CODE','DATE','STARTDATE'],axis=1)
.astype(int)
.reset_index()
print (df)
POSITION AVERAGE1 AGGREGATE MEDIAN1 MEDIAN2 AVERAGE2 AVERAGE3
0 S1 834 3 1025 4210 173 185
1 S2 834 3 1025 4210 173 185
2 S3 834 3 1025 4210 173 185
3 S4 834 3 1025 4210 173 185
4 S5 834 3 1025 4210 173 185
5 S6 834 3 1025 4210 173 185
6 S7 834 3 1025 4210 173 185
7 S8 821 3 1021 4000 172 183
8 T1 834 3 1025 4210 173 185
9 T2 834 3 1025 4210 173 185
10 T3 834 3 1025 4210 173 185
11 T4 834 3 1025 4210 173 185
12 T5 834 3 1025 4210 173 185
13 T6 834 3 1025 4210 173 185
14 T7 834 3 1025 4210 173 185
15 T8 834 3 1025 4210 173 185
另一个解决方案:
df.set_index('POSITION', inplace=True)
#remove unnecessary columns
df = df.drop(['ID','CODE','DATE','STARTDATE'],axis=1)
#index values
pos = ['S' + str(x) for x in range(1, 9)] + ['T' + str(x) for x in range(1,9)]
#DataFrame constructor
df1 = pd.DataFrame(data=[df.ix['ENG']], index=pos)
df1.index.name = 'POSITION'
#get all not ENG index values
not_eng_idx = df.drop('ENG').index
print (not_eng_idx)
Index(['S8'], dtype='object', name='POSITION')
#overwrite DataFrame by values from df
df1.ix[not_eng_idx] = df.ix[not_eng_idx]
df1.reset_index(inplace=True)
print (df1)
POSITION AVERAGE1 AGGREGATE MEDIAN1 MEDIAN2 AVERAGE2 AVERAGE3
0 S1 834 3 1025 4210 173 185
1 S2 834 3 1025 4210 173 185
2 S3 834 3 1025 4210 173 185
3 S4 834 3 1025 4210 173 185
4 S5 834 3 1025 4210 173 185
5 S6 834 3 1025 4210 173 185
6 S7 834 3 1025 4210 173 185
7 S8 821 3 1021 4000 172 183
8 T1 834 3 1025 4210 173 185
9 T2 834 3 1025 4210 173 185
10 T3 834 3 1025 4210 173 185
11 T4 834 3 1025 4210 173 185
12 T5 834 3 1025 4210 173 185
13 T6 834 3 1025 4210 173 185
14 T7 834 3 1025 4210 173 185
15 T8 834 3 1025 4210 173 185
关于python - 从只有几行的csv文件填充数据框的pythonic方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40254022/