As I am struggling around this, how to strip/mask or remove all Nan
values completely across DataFrame so as to see only required values under each column name.
Dataframe:
df = pd.read_csv("linux_server.csv", usecols=['name', 'managed_by'])
df = df.pivot(columns='managed_by', values='name').rename(columns={np.nan: 'Unknown'})
df.columns = df.columns.str.extract('(.*) ')[0]
df = df.rename(columns={np.nan: 'Unknown'})
print(df)
output:
Unknown Audrey Banu Prathap Reddy Carlton Eric Reiner Krishna Wilbert Wim
NaN NaN tdi0960 NaN NaN NaN NaN NaN NaN
NaN NaN tdi0963 NaN NaN NaN NaN NaN NaN
NaN NaN tdi0966 NaN NaN NaN NaN NaN NaN
NaN tdi2513 NaN NaN NaN NaN NaN NaN NaN
NaN NaN tdi0765 NaN NaN NaN NaN NaN NaN
NaN NaN tdi0969 NaN NaN NaN tdi2479 NaN NaN
NaN NaN tdi0970 NaN NaN NaN NaN NaN NaN
NaN NaN tdi2431 NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN tdi0424 NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN tdi2459 NaN
NaN NaN NaN NaN NaN tdi0425 NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN tdi2460 NaN
NaN NaN NaN NaN NaN NaN NaN tdi2461 NaN
NaN NaN NaN NaN NaN NaN NaN tdi2462 NaN
NaN NaN NaN NaN NaN NaN NaN tdi2463 NaN
NaN NaN NaN tdi2546 NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN tdi2464 NaN
NaN NaN NaN NaN NaN tdi0426 NaN NaN NaN
NaN NaN NaN NaN NaN tdi1874 NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN tdi2465 NaN
NaN NaN NaN NaN NaN NaN NaN tdi2466 NaN
NaN NaN NaN NaN NaN NaN NaN tdi2467 NaN
tsnpt01labt004v NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN tdi2468 NaN
NaN NaN NaN NaN NaN NaN NaN NaN tdi2263
tsnpt01labt005v NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN tdi2264
tdi0897 NaN NaN NaN NaN NaN NaN NaN NaN
tsnpt01labt003v NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN vms-wan-cs NaN NaN NaN NaN
Required:
Output without Nan
or empty cells.
Below is just sample for three columns as desired
Unknown Audrey Banu Prathap Reddy
tsnpt01labt004v tdi2513 tdi0960
tsnpt01labt005v tdi0963
tdi0897 tdi0966
tsnpt01labt003v tdi0765
tdi0969
tdi0970
tdi2431
CodePudding user response:
Given your use-case, I think this is the best you can do:
In [2213]: output = pd.DataFrame()
In [2214]: for col in df.columns:
...: output = pd.concat([output, df[col].dropna().reset_index(drop=True)], 1)
...:
In [2217]: output = output.replace(np.nan, '')
In [2218]: output
Out[2218]:
Unknown Audrey Banu_Prathap_Reddy Carlton Eric Reiner Krishna Wilbert Wim
0 tsnpt01labt004v tdi2513 tdi0960 tdi2546 vms-wan-cs tdi0424 tdi2479 tdi2459 tdi2263
1 tsnpt01labt005v tdi0963 tdi0425 tdi2460 tdi2264
2 tdi0897 tdi0966 tdi0426 tdi2461
3 tsnpt01labt003v tdi0765 tdi1874 tdi2462
4 tdi0969 tdi2463
5 tdi0970 tdi2464
6 tdi2431 tdi2465
7 tdi2466
8 tdi2467
9 tdi2468
CodePudding user response:
You could also stack
pivot
. In order to use pivot
, we must create groups first by the column names using groupby
cumcount
.
s = df.replace('Nan', float('nan')).stack()
out = (s.droplevel(0).reset_index(name='value')
.assign(group=s.groupby(level=1).cumcount().to_numpy())
.pivot('group', 'index', 'value')
[df.columns]
.fillna('')
.rename_axis(columns=[None], index=[None]))
Output:
Unknown Audrey Banu_Prathap_Reddy Carlton Eric Reiner Krishna Wilbert Wim
0 tsnpt01labt004v tdi2513 tdi0960 tdi2546 vms-wan-cs tdi0424 tdi2479 tdi2459 tdi2263
1 tsnpt01labt005v tdi0963 tdi0425 tdi2460 tdi2264
2 tdi0897 tdi0966 tdi0426 tdi2461
3 tsnpt01labt003v tdi0765 tdi1874 tdi2462
4 tdi0969 tdi2463
5 tdi0970 tdi2464
6 tdi2431 tdi2465
7 tdi2466
8 tdi2467
9 tdi2468