i want to convert a columns(Azi_0 to Azi_47,Dist_0 to Dist_47) in dataframe(df) to a two column(Azimuth,Distance) as in new_df?
Azi = [f"Azi_{i}" for i in range(47)]
dist = [f"Dist_{i}" for i in range(47)]
expected output,new_df:
Current_Sim_Az_obj1 | Current_Sim_distance_r_obj1 | Azimuth | Distance |
---|---|---|---|
-60 | 3.950372041 | -59.73007665 | 3.07 |
-60 | 3.950372041 | -59.73007665 | 3.07 |
-60 | 6.950372041 | -59.4701257 | 7.89 |
-60 | 6.950372041 | -59.89004647 | 7.765 |
-60 | 8.950372041 | -59.64009363 | 8.345 |
-60 | 8.950372041 | -59.58010495 | 8.425 |
-60 | 8.950372041 | -59.58010495 | 8.425 |
-55 | 2.38397709 | -55.06095763 | 3.14 |
-55 | 2.38397709 | -55.21092934 | 3.065 |
-55 | 2.38397709 | -55.21092934 | 3.065 |
-55 | 2.38397709 | -55.2609199 | 3.03 |
-55 | 2.38397709 | -55.2609199 | 3.03 |
-55 | 2.38397709 | -55.2609199 | 3.03 |
-55 | 2.38397709 | -55.2609199 | 3.03 |
-55 | 2.38397709 | -55.03096329 | 3.105 |
-55 | 2.38397709 | -55.03096329 | 3.105 |
-55 | 2.38397709 | -55.32090858 | 3 |
-55 | 2.38397709 | -55.32090858 | 3 |
-55 | 2.38397709 | -55.27091802 | 3.12 |
-55 | 2.38397709 | -55.27091802 | 3.12 |
-55 | 2.38397709 | -55.8508086 | 3.09 |
-55 | 2.38397709 | -55.8508086 | 3.09 |
-55 | 2.38397709 | -55.57086142 | 3.065 |
-55 | 2.38397709 | -55.57086142 | 3.065 |
How to combine several columns to a single column?
CodePudding user response:
You are essentially asking how to coalesce a values of certain df-columns into one column - you can do it like this:
from random import choice
import pandas as pd
# all azimuth names
azi_names = [f"Azi_{i}" for i in range(5)]
# all distance names
dist_names = [f"Dist_{i}" for i in range(5)]
df = pd.DataFrame(columns = azi_names dist_names)
# put some values in
for i in range(20):
k = choice(range(5))
df = df.append({f"Azi_{k}": i, f"Dist_{k}": i}, ignore_index=True)
print(df)
which randomly creates:
Azi_0 Azi_1 Azi_2 Azi_3 Azi_4 Dist_0 Dist_1 Dist_2 Dist_3 Dist_4
0 NaN NaN NaN 0.0 NaN NaN NaN NaN 0.0 NaN
1 NaN 1.0 NaN NaN NaN NaN 1.0 NaN NaN NaN
2 2.0 NaN NaN NaN NaN 2.0 NaN NaN NaN NaN
3 NaN NaN 3.0 NaN NaN NaN NaN 3.0 NaN NaN
4 NaN 4.0 NaN NaN NaN NaN 4.0 NaN NaN NaN
5 NaN NaN NaN NaN 5.0 NaN NaN NaN NaN 5.0
6 6.0 NaN NaN NaN NaN 6.0 NaN NaN NaN NaN
7 NaN 7.0 NaN NaN NaN NaN 7.0 NaN NaN NaN
8 NaN 8.0 NaN NaN NaN NaN 8.0 NaN NaN NaN
9 9.0 NaN NaN NaN NaN 9.0 NaN NaN NaN NaN
10 NaN NaN 10.0 NaN NaN NaN NaN 10.0 NaN NaN
11 11.0 NaN NaN NaN NaN 11.0 NaN NaN NaN NaN
12 12.0 NaN NaN NaN NaN 12.0 NaN NaN NaN NaN
13 NaN NaN 13.0 NaN NaN NaN NaN 13.0 NaN NaN
14 NaN 14.0 NaN NaN NaN NaN 14.0 NaN NaN NaN
15 NaN NaN NaN 15.0 NaN NaN NaN NaN 15.0 NaN
16 NaN NaN NaN NaN 16.0 NaN NaN NaN NaN 16.0
17 NaN NaN 17.0 NaN NaN NaN NaN 17.0 NaN NaN
18 NaN NaN NaN NaN 18.0 NaN NaN NaN NaN 18.0
19 NaN NaN NaN 19.0 NaN NaN NaN NaN 19.0 NaN
To coalesce this and only keep filled values you use
df2 = pd.DataFrame()
# propagates values and chooses first
df2["AZI"] = df[azi_names].bfill(axis=1).iloc[:, 0]
df2["DIS"] = df[dist_names].bfill(axis=1).iloc[:, 0]
print(df2)
to get a coalesced new df:
AZI DIS
0 0.0 0.0
1 1.0 1.0
2 2.0 2.0
3 3.0 3.0
4 4.0 4.0
5 5.0 5.0
6 6.0 6.0
7 7.0 7.0
8 8.0 8.0
9 9.0 9.0
10 10.0 10.0
11 11.0 11.0
12 12.0 12.0
13 13.0 13.0
14 14.0 14.0
15 15.0 15.0
16 16.0 16.0
17 17.0 17.0
18 18.0 18.0
19 19.0 19.0
Attributation: inspired by Erfan's answer to Coalesce values from 2 columns into a single column in a pandas dataframe
You may need to Replacing blank values (white space) with NaN in pandas for your shown data.