I have such .txt file:
Field | Value |
---|---|
First | 1 |
Second | alfa |
First | 23 |
Second | beta |
First | 55 |
Second | omega |
I need to read and transform this file to get data like this:
First | Second |
---|---|
1 | alfa |
23 | beta |
55 | omega |
I start with this:
file = './data.txt'
df = pd.read_csv(file, sep='\t',header=None, skiprows=89, skipfooter=11, engine='python')
df = df.pivot(values=1, columns=0)
but it looks as I need to generate some indexes otherwise my pivoted table looks not very well
First | Second |
---|---|
1 | |
alfa | |
23 | |
beta | |
55 | |
omega |
Is any other solution hot to read that data and get the results that I need?
CodePudding user response:
in order to make your code work I had to modify the way you access the .csv file, as I don't have that many rows.
import pandas as pd
file = './data.txt'
df = pd.read_csv(file, sep='\t',header=0, engine='python')
df = df.pivot(values='Value', columns='Field')
# for each column on the dataframe, sort the value and ignore the index
for col in df.columns:
df[col] = df[col].sort_values(ignore_index=True)
# drop NaN
df.dropna(axis=0, how='all', inplace=True)
# Show dataframe
print(df)
Here some more info about .sort_values:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_values.html
Hope it can help :)
CodePudding user response:
The trick is you need to create common keys for the index. Using .assign create a column named CommonKeys which is the cumcount of grouping on the Fields column. Finally chain functions to pivot and clean up the df.
df = (
df.assign(CommonKeys=df.groupby("Field").cumcount())
.pivot(index="CommonKeys", columns="Field", values="Value")
.reset_index(drop=True)
.rename_axis(None, axis=1)
)
print(df)
Output:
First Second
0 1 alfa
1 23 beta
2 55 omega