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

Categories