Transforming pandas dataframe, where column entries are column headers - python
My dataset has 12 columns, X1-X6 and Y1-Y6. The variables X and Y match to each other - the first record means: 80 parts of A, 10 parts of C, 2 parts of J and 8 parts of K (each row has 100 total).
I would like to be able to transform my dataset into a dataset in which the entries in columns X1-X6 are now the headers. See before and after datasets below.
My dataset (before):
X1 X2 X3 X4 X5 X6 Y1 Y2 Y3 Y4 Y5 Y6
0 A C J K NaN NaN 80.0 10.0 2.0 8.0 NaN NaN
1 F N O NaN NaN NaN 2.0 25.0 73.0 NaN NaN NaN
2 A H J M NaN NaN 70.0 6.0 15.0 9.0 NaN NaN
3 B I K P NaN NaN 0.5 1.5 2.0 96.0 NaN NaN
4 A B F H O P 83.0 4.0 9.0 2.0 1.0 1.0
5 A B F G NaN NaN 1.0 16.0 9.0 74.0 NaN NaN
6 A B D F L NaN 95.0 2.0 1.0 1.0 1.0 NaN
7 B F H P NaN NaN 0.2 0.4 0.4 99.0 NaN NaN
8 A D F L NaN NaN 35.0 12.0 30.0 23.0 NaN NaN
9 A B F I O NaN 95.0 0.3 0.1 1.6 3.0 NaN
10 B E G NaN NaN NaN 10.0 31.0 59.0 NaN NaN NaN
11 A F G L NaN NaN 24.0 6.0 67.0 3.0 NaN NaN
12 A C I NaN NaN NaN 65.0 30.0 5.0 NaN NaN NaN
13 A F G L NaN NaN 55.0 6.0 4.0 35.0 NaN NaN
14 A F J K L NaN 22.0 3.0 12.0 0.8 62.2 NaN
15 B F I P NaN NaN 0.6 1.2 0.2 98.0 NaN NaN
16 A B F H O NaN 27.0 6.0 46.0 13.0 8.0 NaN
The dataset I'd like to transform to:
A B C D E F G H I J K L M \
0 80.0 NaN 10.0 NaN NaN NaN NaN NaN NaN 2.0 8.0 NaN NaN
1 NaN NaN NaN NaN NaN 2.0 NaN NaN NaN NaN NaN NaN NaN
2 70.0 NaN NaN NaN NaN NaN NaN 6.0 NaN 15.0 NaN NaN 9.0
3 NaN 0.5 NaN NaN NaN NaN NaN NaN 1.5 NaN 2.0 NaN NaN
4 83.0 4.0 NaN NaN NaN 9.0 NaN 2.0 NaN NaN NaN NaN NaN
5 1.0 16.0 NaN NaN NaN 9.0 74.0 NaN NaN NaN NaN NaN NaN
6 95.0 2.0 NaN 1.0 NaN 1.0 NaN NaN NaN NaN NaN 1.0 NaN
7 NaN 0.2 NaN NaN NaN 0.4 NaN 0.4 NaN NaN NaN NaN NaN
8 35.0 NaN NaN 12.0 NaN 30.0 NaN NaN NaN NaN NaN 23.0 NaN
9 95.0 0.3 NaN NaN NaN 0.1 NaN NaN 1.6 NaN NaN NaN NaN
10 NaN 10.0 NaN NaN 31.0 NaN 59.0 NaN NaN NaN NaN NaN NaN
11 24.0 NaN NaN NaN NaN 6.0 67.0 NaN NaN NaN NaN 3.0 NaN
12 65.0 NaN 30.0 NaN NaN NaN NaN NaN 5.0 NaN NaN NaN NaN
13 55.0 NaN NaN NaN NaN 6.0 4.0 NaN NaN NaN NaN 35.0 NaN
14 22.0 NaN NaN NaN NaN 3.0 NaN NaN NaN 12.0 0.8 62.2 NaN
15 NaN 0.6 NaN NaN NaN 1.2 NaN NaN 0.2 NaN NaN NaN NaN
16 27.0 6.0 NaN NaN NaN 46.0 NaN 13.0 NaN NaN NaN NaN NaN
N O P
0 NaN NaN NaN
1 25.0 73.0 NaN
2 NaN NaN NaN
3 NaN NaN 96.0
4 NaN 1.0 1.0
5 NaN NaN NaN
6 NaN NaN NaN
7 NaN NaN 99.0
8 NaN NaN NaN
9 NaN 3.0 NaN
10 NaN NaN NaN
11 NaN NaN NaN
12 NaN NaN NaN
13 NaN NaN NaN
14 NaN NaN NaN
15 NaN NaN 98.0
16 NaN 8.0 NaN
As you know that you want the Xi part to contain the column names for the new dataframe, while the Yi part would be the value, it is enough to change every line in a dict where Xi is the key and Yi the value. Then you use the list of that dictionnaries to feed the new dataframe:
data = list(df.apply(lambda x: {x['X'+ str(i)]: x['Y'+str(i)] for i in range(1,7)
if x['X'+str(i)]!= 'NaN'}, axis=1))
resul = pd.DataFrame(data)
print(resul)
gives:
A B C D E F ... K L M N O P
0 80.0 NaN 10.0 NaN NaN NaN ... 8.0 NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN 2.0 ... NaN NaN NaN 25.0 73.0 NaN
2 70.0 NaN NaN NaN NaN NaN ... NaN NaN 9.0 NaN NaN NaN
3 NaN 0.5 NaN NaN NaN NaN ... 2.0 NaN NaN NaN NaN 96.0
4 83.0 4.0 NaN NaN NaN 9.0 ... NaN NaN NaN NaN 1.0 1.0
5 1.0 16.0 NaN NaN NaN 9.0 ... NaN NaN NaN NaN NaN NaN
6 95.0 2.0 NaN 1.0 NaN 1.0 ... NaN 1.0 NaN NaN NaN NaN
7 NaN 0.2 NaN NaN NaN 0.4 ... NaN NaN NaN NaN NaN 99.0
8 35.0 NaN NaN 12.0 NaN 30.0 ... NaN 23.0 NaN NaN NaN NaN
9 95.0 0.3 NaN NaN NaN 0.1 ... NaN NaN NaN NaN 3.0 NaN
10 NaN 10.0 NaN NaN 31.0 NaN ... NaN NaN NaN NaN NaN NaN
11 24.0 NaN NaN NaN NaN 6.0 ... NaN 3.0 NaN NaN NaN NaN
12 65.0 NaN 30.0 NaN NaN NaN ... NaN NaN NaN NaN NaN NaN
13 55.0 NaN NaN NaN NaN 6.0 ... NaN 35.0 NaN NaN NaN NaN
14 22.0 NaN NaN NaN NaN 3.0 ... 0.8 62.2 NaN NaN NaN NaN
15 NaN 0.6 NaN NaN NaN 1.2 ... NaN NaN NaN NaN NaN 98.0
16 27.0 6.0 NaN NaN NaN 46.0 ... NaN NaN NaN NaN 8.0 NaN
[17 rows x 16 columns]
One way to handle this. Loop through each row, splitting the dataframe in half using iloc. Then build a new dictionary using zip, then create a resulting dataframe.
df_dict = {x: list(zip(df.iloc[x,0:6], df.iloc[x,6:12])) for x in range(df.shape[0])}
df1 = pd.DataFrame.from_dict(pd_dict, orient='index')
df1.sort_index(1)
A B C F H I J K M N O P nan
0 80.0 NaN 10.0 NaN NaN NaN 2.0 8.0 NaN NaN NaN NaN NaN
1 NaN NaN NaN 2.0 NaN NaN NaN NaN NaN 25.0 73.0 NaN NaN
2 70.0 NaN NaN NaN 6.0 NaN 15.0 NaN 9.0 NaN NaN NaN NaN
3 NaN 0.5 NaN NaN NaN 1.5 NaN 2.0 NaN NaN NaN 96. NaN
4 83.0 4.0 NaN 9.0 2.0 NaN NaN NaN NaN NaN 1.0 1.0 NaN
Related
how to pivot dataframe to square matrix in pandas
I don't know how i pivot table in picture one to square matrix in table 2. Value is distinct count anonymous_id Want to know how many users join in event voucher denied and item_checkout_started, etc. ? Thanks!
pivot require 3 argumnts: index (anonymous_id) - in this case column - Column to use to make new frame’s columns. values - Column(s) to use for populating new frame’s values. df.pivot(index=["anonymous_id"], columns=["list_event_n"],values="at")
You can try .pivot_table() with aggfunc='count' to count the number of occurrences of anonymous_id, as folllows: df.pivot_table(index='list_event_n', columns='list_event_n', values='anonymous_id', aggfunc='count') Result: list_event_n item_checkout_started item_viewed outlet_list_viewed outlet_product_clicked outlet_promo_clicked popup_registered popup_viewed product_clicked product_list_viewed product_searched product_viewed promotion_viewed item_checkout_started item_viewed outlet_list_viewed outlet_product_clicked outlet_promo_clicked popup_registered popup_viewed product_clicked product_list_viewed product_searched product_viewed promotion_viewed list_event_n item_checkout_started 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN item_viewed NaN 15.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 15.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN outlet_list_viewed NaN NaN 2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN outlet_product_clicked NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN outlet_promo_clicked NaN NaN NaN NaN 7.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.0 NaN NaN NaN NaN NaN NaN NaN popup_registered NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN popup_viewed NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN product_clicked NaN NaN NaN NaN NaN NaN NaN 17.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 17.0 NaN NaN NaN NaN product_list_viewed NaN NaN NaN NaN NaN NaN NaN NaN 7.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7.0 NaN NaN NaN product_searched NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0 NaN NaN product_viewed NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 16.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 16.0 NaN promotion_viewed NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
Pandas row filtering reproduces entire table and turns data into NaNs [duplicate]
This question already has answers here: How to change column names in pandas Dataframe using a list of names? (5 answers) Closed 3 years ago. I have a Pandas dataframe with several columns. I want to create a new dataframe which contains all the rows in the original dataframe for which the boolean value "Present" is True. Normally the way you are supposed to do this is by calling grades[grades['Present']], but I get the following unexpected result: It reproduces the entire dataframe, except changes the True values in the "Present" column to 1s (the False ones become NaNs). Any idea why this might be happening? Here is my full script: import pandas as pd # read CSV and clean up data grades = pd.read_csv("2학기 speaking test grades - 2·3학년.csv") grades = grades[["Year","Present?","내용 / 30","유찬성 / 40","태도 / 30"]] grades.columns = [["Year","Present","Content","Fluency","Attitude"]] # Change integer Present to a boolean grades['Present']=grades['Present']==1 print(grades.head()) print(grades.dtypes) print(grades[grades['Present']]) And terminal output: Year Present Content Fluency Attitude 0 2 True 30.0 40.0 30.0 1 2 True 30.0 40.0 30.0 2 2 True 30.0 40.0 30.0 3 2 True 30.0 40.0 30.0 4 2 True 30.0 40.0 30.0 Year int64 Present bool Content float64 Fluency float64 Attitude float64 dtype: object Year Present Content Fluency Attitude 0 NaN 1.0 NaN NaN NaN 1 NaN 1.0 NaN NaN NaN 2 NaN 1.0 NaN NaN NaN 3 NaN 1.0 NaN NaN NaN 4 NaN 1.0 NaN NaN NaN 5 NaN 1.0 NaN NaN NaN 6 NaN 1.0 NaN NaN NaN 7 NaN 1.0 NaN NaN NaN 8 NaN 1.0 NaN NaN NaN 9 NaN 1.0 NaN NaN NaN 10 NaN 1.0 NaN NaN NaN 11 NaN 1.0 NaN NaN NaN 12 NaN 1.0 NaN NaN NaN 13 NaN 1.0 NaN NaN NaN 14 NaN 1.0 NaN NaN NaN 15 NaN 1.0 NaN NaN NaN 16 NaN 1.0 NaN NaN NaN 17 NaN 1.0 NaN NaN NaN 18 NaN 1.0 NaN NaN NaN 19 NaN 1.0 NaN NaN NaN 20 NaN 1.0 NaN NaN NaN 21 NaN 1.0 NaN NaN NaN 22 NaN 1.0 NaN NaN NaN 23 NaN 1.0 NaN NaN NaN 24 NaN 1.0 NaN NaN NaN 25 NaN 1.0 NaN NaN NaN 26 NaN 1.0 NaN NaN NaN 27 NaN 1.0 NaN NaN NaN 28 NaN 1.0 NaN NaN NaN 29 NaN 1.0 NaN NaN NaN .. ... ... ... ... ... 91 NaN NaN NaN NaN NaN 92 NaN NaN NaN NaN NaN 93 NaN 1.0 NaN NaN NaN 94 NaN 1.0 NaN NaN NaN 95 NaN NaN NaN NaN NaN 96 NaN 1.0 NaN NaN NaN 97 NaN 1.0 NaN NaN NaN 98 NaN 1.0 NaN NaN NaN 99 NaN 1.0 NaN NaN NaN 100 NaN 1.0 NaN NaN NaN 101 NaN 1.0 NaN NaN NaN 102 NaN 1.0 NaN NaN NaN 103 NaN 1.0 NaN NaN NaN 104 NaN 1.0 NaN NaN NaN 105 NaN 1.0 NaN NaN NaN 106 NaN 1.0 NaN NaN NaN 107 NaN 1.0 NaN NaN NaN 108 NaN 1.0 NaN NaN NaN 109 NaN 1.0 NaN NaN NaN 110 NaN 1.0 NaN NaN NaN 111 NaN 1.0 NaN NaN NaN 112 NaN 1.0 NaN NaN NaN 113 NaN 1.0 NaN NaN NaN 114 NaN 1.0 NaN NaN NaN 115 NaN 1.0 NaN NaN NaN 116 NaN 1.0 NaN NaN NaN 117 NaN 1.0 NaN NaN NaN 118 NaN 1.0 NaN NaN NaN 119 NaN 1.0 NaN NaN NaN 120 NaN 1.0 NaN NaN NaN [121 rows x 5 columns] Here is the CSV file. SE won't let me upload it directly, so if you paste it into your own CSV file you'll need to modify the Python code above to specify that it's in the EUC-KR encoding, like so: pd.read_csv("paste.csv",encoding="EUC-KR") Year,Class,Year / class * presence (used to filter for averages),Present?,내용 / 30,유찬성 / 40,태도 / 30,Total,,,Averages (평균점),, 2,2,22,1,30,40,30,100,,,Grade distribution (점수 막대 그래프),, 2,2,22,1,30,40,30,100,,,The graph below includes the scores of all students in grades 2 and 3. ,, 2,2,22,1,30,40,30,100,,,아래 그래프에는 2·3학년에서 모든 학생의 점수가 정리됩니다.,, 2,2,22,1,30,40,30,100,,,,, 2,2,22,1,30,40,30,100,,,,, 2,1,21,1,30,40,30,100,,,,, 2,1,21,1,30,40,30,100,,,,, 2,1,21,1,30,40,30,100,,,,, 2,1,21,1,30,40,30,100,,,,, 2,1,21,1,30,40,30,100,,,,, 2,1,21,1,30,40,30,100,,,,, 3,2,32,1,30,40,30,100,,,,, 3,2,32,1,30,40,30,100,,,,, 3,2,32,1,30,40,30,100,,,,, 3,2,32,1,30,40,30,100,,,,, 3,2,32,1,30,40,30,100,,,,, 3,2,32,1,30,40,30,100,,,,, 3,2,32,1,30,40,30,100,,,,, 3,2,32,1,30,40,30,100,,,,, 2,2,22,1,30,30,30,90,,,,, 2,2,22,1,30,30,30,90,,,,, 2,2,22,1,30,30,30,90,,,,, 2,2,22,1,30,30,30,90,,,Average scores (평균점),, 2,2,22,1,30,30,30,90,,,These averages only count students who were present for the test.,, 2,2,22,1,30,30,30,90,,,평균점에는 참석한 학생의 점수만 포함됩니다.,, 2,2,22,1,30,30,30,90,,,,, 2,2,22,1,30,30,30,90,,,2학년 1반,,77.1 2,1,21,1,30,30,30,90,,,2학년 2반,,77.6 2,1,21,1,30,30,30,90,,,3학년 1반,,71.5 2,1,21,1,30,30,30,90,,,3학년 2반,,77.4 2,1,21,1,30,30,30,90,,,,, 2,1,21,1,30,30,30,90,,,,, 2,1,21,1,30,30,30,90,,,,, 2,1,21,1,30,30,30,90,,,,, 2,1,21,1,30,30,30,90,,,,, 2,1,21,1,30,30,30,90,,,,, 2,1,21,1,30,30,30,90,,,,, 2,1,21,1,30,30,30,90,,,,, 3,2,32,1,30,30,30,90,,,,, 3,2,32,1,30,30,30,90,,,,, 3,2,32,1,30,30,30,90,,,,, 3,2,32,1,30,30,30,90,,,,, 3,2,32,1,20,40,30,90,,,,, 2,2,22,1,20,30,30,80,,,,, 2,2,22,1,20,30,30,80,,,,, 2,2,22,1,30,20,30,80,,,,, 2,2,22,1,30,20,30,80,,,,, 2,2,22,1,30,30,20,80,,,,, 2,2,22,1,30,20,30,80,,,,, 2,1,21,1,20,30,30,80,,,,, 2,1,21,1,20,30,30,80,,,,, 2,1,21,1,30,30,20,80,,,,, 3,2,32,1,20,30,30,80,,,,, 3,2,32,1,30,20,30,80,,,,, 3,2,32,1,20,30,30,80,,,,, 3,2,32,1,30,30,20,80,,,,, 3,2,32,1,30,20,30,80,,,,, 2,2,22,1,10,30,30,70,,,,, 2,2,22,1,20,20,30,70,,,,, 2,2,22,1,30,20,20,70,,,,, 2,2,22,1,20,20,30,70,,,,, 2,2,22,1,20,20,30,70,,,,, 3,2,32,1,30,10,30,70,,,,, 3,2,32,1,20,30,20,70,,,,, 3,2,32,1,20,20,30,70,,,,, 2,1,21,1,20,20,20,60,,,,, 2,1,21,1,10,20,30,60,,,,, 2,2,22,1,10,20,20,50,,,,, 2,2,22,1,10,10,30,50,,,,, 2,1,21,1,10,10,30,50,,,,, 2,1,21,1,20,20,10,50,,,,, 3,2,32,1,10,10,30,50,,,,, 3,2,32,1,10,10,30,50,,,,, 2,2,22,1,10,0,30,40,,,,, 2,1,21,1,10,0,30,40,,,,, 3,2,32,1,10,0,30,40,,,,, 3,2,32,1,10,10,20,40,,,,, 2,2,22,1,0,0,30,30,,,,, 2,1,21,1,0,0,30,30,,,,, 2,1,21,1,0,0,30,30,,,,, 3,2,32,1,0,0,30,30,,,,, 3,2,32,1,0,0,20,20,,,,, 2,1,21,1,0,0,10,10,,,,, 2,2,22,1,0,0,30,30,,,,, 2,2,0,0,,,,0,,,,, 2,2,0,0,,,,0,,,,, 2,1,0,0,,,,0,,,,, 2,1,0,0,,,,0,,,,, 2,1,0,0,,,,0,,,,, 2,1,0,0,,,,0,,,,, 3,2,0,0,,,,0,,,,, 3,2,0,0,,,,0,,,,, 3,1,0,0,,,,0,,,,, 3,1,31,1,30,20,30,80,,,,, 3,1,31,1,0,0,30,30,,,,, 3,1,0,0,,,,0,,,,, 3,1,31,1,30,20,10,60,,,,, 3,1,31,1,30,30,30,90,,,,, 3,1,31,1,30,30,30,90,,,,, 3,1,31,1,20,20,20,60,,,,, 3,1,31,1,30,20,30,80,,,,, 3,1,31,1,30,40,30,100,,,,, 3,1,31,1,30,30,30,90,,,,, 3,1,31,1,30,30,30,90,,,,, 3,1,31,1,30,30,30,90,,,,, 3,1,31,1,20,30,20,70,,,,, 3,1,31,1,30,30,30,90,,,,, 3,1,31,1,30,40,30,100,,,,, 3,1,31,1,30,20,10,60,,,,, 3,1,31,1,20,10,20,50,,,,, 3,1,31,1,30,20,30,80,,,,, 3,1,31,1,0,0,20,20,,,,, 3,1,31,1,30,30,30,90,,,,, 3,1,31,1,30,30,30,90,,,,, 3,1,31,1,30,30,30,90,,,,, 3,1,31,1,0,0,20,20,,,,, 3,1,31,1,20,10,10,40,,,,, 3,1,31,1,30,30,30,90,,,,, 3,1,31,1,20,20,30,70,,,,, 3,1,31,1,30,20,10,60,,,,, 3,1,31,1,10,10,30,50,,,,, Thank you.
You forgot to filter the Present column by True. You can do it this way. grades = grades[grades["Present"] == True] If the boolean is stored as a string then use the double quotation. grades = grades[grades["Present"] == "True"]
Get lines Pandas with groupby ignoring NaNs
I need to get rows in my dataframe (using .last_valid_index()), but some of the indices which satisfy the condition are NaN (that's fine, as I may have some empty blocks between the cuts). df.groupby('cuts').apply(lambda x: x.q1.last_valid_index()) Out[289]: cuts (2016-04-29 23:59:59.999999999, 2016-05-14] 13.0 (2016-05-14, 2016-05-28] 19.0 (2016-05-28, 2016-06-11] NaN (2016-06-11, 2016-06-25] NaN (2016-06-25, 2016-07-09] NaN (2016-07-09, 2016-07-23] 75.0 (2016-07-23, 2016-08-06] NaN (2016-08-06, 2016-08-20] NaN (2016-08-20, 2016-09-03] NaN (2016-09-03, 2016-09-17] 138.0 (2016-09-17, 2016-10-01] NaN (2016-10-01, 2016-10-15] 156.0 (2016-10-15, 2016-10-29] NaN I need to get rid of NaNs, I tried something like: df.groupby('cuts').apply(lambda x: x.loc[x.q1.last_valid_index()] if (x.q1.last_valid_index() > 0) but it didn't work. I'm sure it should be very simple, but I'm struggling to find a neat solution. EDIT df[:50] Out[305]: response_date q1 crp ferritin hb q2 plasma platelets transferrin q3 wcc value a1 a2 a3 a4 0 2016-04-27 34.0 6.1 15.3 136.0 NaN 1.0 404.0 27.0 NaN 9.33 NaN NaN NaN NaN NaN 1 2016-04-30 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 12.0 0.98 80.0 1.0 2 2016-05-01 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1089.0 NaN NaN NaN NaN 3 2016-05-02 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 4 2016-05-03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5 2016-05-04 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6 2016-05-05 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7 2016-05-06 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8 2016-05-07 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 9 2016-05-08 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10 2016-05-09 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 11 2016-05-10 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 12 2016-05-11 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 13 2016-05-12 38.0 1.1 11.1 135.0 4.0 1.0 382.0 18.0 5.0 10.60 NaN NaN NaN NaN NaN 14 2016-05-13 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 15 2016-05-14 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 12.0 0.83 80.0 1.0 16 2016-05-15 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 17 2016-05-16 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 18 2016-05-17 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 19 2016-05-18 36.0 8.8 15.6 138.0 NaN NaN 369.0 23.0 NaN 9.78 NaN NaN NaN NaN NaN 20 2016-05-19 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 21 2016-05-20 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 22 2016-05-21 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 23 2016-05-22 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 24 2016-05-23 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 25 2016-05-24 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 26 2016-05-25 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 27 2016-05-26 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 28 2016-05-27 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 29 2016-05-28 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 14.0 1.60 80.0 1.0 30 2016-05-29 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 31 2016-05-30 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 32 2016-05-31 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 33 2016-06-01 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 34 2016-06-02 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 802.0 NaN NaN NaN NaN 35 2016-06-03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 36 2016-06-04 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 37 2016-06-05 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 38 2016-06-06 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 39 2016-06-07 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 40 2016-06-08 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 41 2016-06-09 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 42 2016-06-10 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 43 2016-06-11 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 13.0 1.40 75.0 1.0 44 2016-06-12 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 45 2016-06-13 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 46 2016-06-14 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 47 2016-06-15 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 48 2016-06-16 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 49 2016-06-17 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN I need to extract data (blood results) between the dates of a1. I'm usind pd.cut, to get blocks between the dates of a1. If you notice, within some block of a1, there are not blood results, so this is how I got NaN previously. I need to get only rows with bloods between the dates of a1. However, there are might be more than one set of bloods between the dates, so this is why I'm taking the last set of results, which is closer to the end of the a1 block.
Sorting the columns of a pandas dataframe
Out[1015]: gp2 department MOBILE QA TA WEB MOBILE QA TA WEB minutes minutes minutes minutes growth growth growth growth period 2016-12-24 NaN NaN 140.0 400.0 NaN NaN 0.0 260.0 2016-12-25 NaN NaN NaN 80.0 NaN NaN NaN -320.0 2016-12-26 NaN NaN NaN 20.0 NaN NaN NaN -60.0 2016-12-27 NaN 45.0 NaN 180.0 NaN 25.0 NaN 135.0 2016-12-28 600.0 NaN NaN 15.0 420.0 NaN NaN -585.0 ... ... ... ... ... ... ... ... ... 2017-01-03 NaN NaN NaN 80.0 NaN NaN NaN -110.0 2017-01-04 20.0 NaN NaN NaN -60.0 NaN NaN NaN 2017-02-01 120.0 NaN NaN NaN 100.0 NaN NaN NaN 2017-02-02 45.0 NaN NaN NaN -75.0 NaN NaN NaN 2017-02-03 NaN 45.0 NaN 30.0 NaN 0.0 NaN -15.0 I need MOBILE.minutes and MOBILE.growth to be one after another. I tried this In [1019]:gp2.columns = gp2.columns.sort_values() In [1020]: gp2 Out[1020]: department MOBILE QA TA WEB growth minutes growth minutes growth minutes growth minutes period 2016-12-24 NaN NaN 140.0 400.0 NaN NaN 0.0 260.0 2016-12-25 NaN NaN NaN 80.0 NaN NaN NaN -320.0 2016-12-26 NaN NaN NaN 20.0 NaN NaN NaN -60.0 2016-12-27 NaN 45.0 NaN 180.0 NaN 25.0 NaN 135.0 2016-12-28 600.0 NaN NaN 15.0 420.0 NaN NaN -585.0 ... ... ... ... ... ... ... ... ... 2017-01-03 NaN NaN NaN 80.0 NaN NaN NaN -110.0 2017-01-04 20.0 NaN NaN NaN -60.0 NaN NaN NaN 2017-02-01 120.0 NaN NaN NaN 100.0 NaN NaN NaN 2017-02-02 45.0 NaN NaN NaN -75.0 NaN NaN NaN 2017-02-03 NaN 45.0 NaN 30.0 NaN 0.0 NaN -15.0 It sorted just the columns but didn't assign them proper values.
Just use df.sort_index: df = df.sort_index(level=[0, 1], axis=1) print(df) MOBILE QA TA WEB growth minutes growth minutes growth minutes growth minutes period 2016-12-24 NaN NaN NaN NaN 0.0 140.0 260.0 400.0 2016-12-25 NaN NaN NaN NaN NaN NaN -320.0 80.0 2016-12-26 NaN NaN NaN NaN NaN NaN -60.0 20.0 2016-12-27 NaN NaN 25.0 45.0 NaN NaN 135.0 180.0 2016-12-28 420.0 600.0 NaN NaN NaN NaN -585.0 15.0 2017-01-03 NaN NaN NaN NaN NaN NaN -110.0 80.0 2017-01-04 -60.0 20.0 NaN NaN NaN NaN NaN NaN 2017-02-01 100.0 120.0 NaN NaN NaN NaN NaN NaN 2017-02-02 -75.0 45.0 NaN NaN NaN NaN NaN NaN 2017-02-03 NaN NaN 0.0 45.0 NaN NaN -15.0 30.0
Complete the index and columns in pandas(DataFrame)?
Here is a datafrmae. a = pd.DataFrame({'a':np.arange(10)}, index=np.arange(0,20,2)) # then I can create new dataframe and complete the index. b = pd.DataFrame(index=np.arange(20)) b['a'] = a # Now convert the index np.arange(0,20,2) to np.arange(20). Fill noexists value by np.nan. But how can i do the same way to column? Suppose the column's dtype is int32 and names is np.arange(0,20,2).
It seems you need reindex: print (a.reindex(b.index)) a 0 0.0 1 NaN 2 1.0 3 NaN 4 2.0 5 NaN 6 3.0 7 NaN 8 4.0 9 NaN 10 5.0 11 NaN 12 6.0 13 NaN 14 7.0 15 NaN 16 8.0 17 NaN 18 9.0 19 NaN Also can reindex columns: a.columns = [0] print (a.reindex(index=b.index, columns=np.arange(0,20,2))) 0 2 4 6 8 10 12 14 16 18 0 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 4 2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 6 3.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 7 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8 4.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 9 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10 5.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 11 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 12 6.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 13 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 14 7.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 15 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 16 8.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 17 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 18 9.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 19 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN