python panda Dataframe 重置索引

ecfsfe2w  于 2023-01-04  发布在  Python
关注(0)|答案(4)|浏览(164)

我有这样一个 Dataframe :
| 出席|电子邮件|加入日期|加入时间|加入时间|
| - ------| - ------| - ------| - ------| - ------|
| | | | 加入时间第一|最后加入时间|
| 是的|009英德拉Git|2022年12月3日|2022年12月3日19时50分|2022年12月3日21时47分|
| Yes | 09871143420.ms | 12/18/2022 | 12/18/2022 20:41 | 12/18/2022 20:41 |
| 是的|09s.bisht|二○二二年十二月十七日|2022年12月17日19:51| 2022年12月17日19:51|
我需要像这样修改列标题:
| 出席|电子邮件|加入日期|加入时间第一|最后加入时间|
| - ------| - ------| - ------| - ------| - ------|
| 是的|009英德拉Git|2022年12月3日|2022年12月3日19时50分|2022年12月3日21时47分|
| Yes | 09871143420.ms | 12/18/2022 | 12/18/2022 20:41 | 12/18/2022 20:41 |
| 是的|09s.bisht|二○二二年十二月十七日|2022年12月17日19:51| 2022年12月17日19:51|
我尝试了多种方法,但都没有成功,任何帮助都将不胜感激。为了到达第一个 Dataframe ,这是我所做的:

import pandas as pd
df = pd.DataFrame({"Attended":["Yes","Yes","Yes"]
                    ,"Email":["009indrajeet","09871143420.ms","09s.bisht"]
                    ,"JoinTime":["Dec 3, 2022 19:50:52","Dec 3, 2022 20:10:52","Dec 3, 2022 21:47:32"]})
#convert JoinTime to timestamp column
df['JoinTime'] = pd.to_datetime(df['JoinTime'],format='%b %d, %Y %H:%M:%S', errors='raise')
#extract date from timestamp column
df['JoinDate'] = df['JoinTime'].dt.date
#created grouper dataset
df_grp = df.groupby(["Attended","Email","JoinDate"])
#define aggregations
dict_agg = {'JoinTime':[('JoinTimeFirst','min'),('JoinTimeLast','max'),('JoinTimes',set)]}
#do grouping with aggregations
df = df_grp.agg(dict_agg).reset_index()

打印(df)

print(df.columns)

MultiIndex([('Attended',              ''),
            (   'Email',              ''),
            ('JoinDate',              ''),
            ('JoinTime', 'JoinTimeFirst'),
            ('JoinTime',  'JoinTimeLast'),
            ('JoinTime',     'JoinTimes')],
           )
qni6mghb

qni6mghb1#

使用命名聚合-传递格式已更改的字典-键是新列名,值是元组-第一个值是处理列,第二个值是聚合函数:

dict_agg = {'JoinTimeFirst':('JoinTime','min'),
            'JoinTimeLast':('JoinTime','min'),
            'JoinTimes':('JoinTime',set)}
#do grouping with aggregations
df = df_grp.agg(**dict_agg).reset_index() 
print (df)
  Attended           Email    JoinDate       JoinTimeFirst  \
0      Yes    009indrajeet  2022-12-03 2022-12-03 19:50:52   
1      Yes  09871143420.ms  2022-12-03 2022-12-03 20:10:52   
2      Yes       09s.bisht  2022-12-03 2022-12-03 21:47:32   

         JoinTimeLast              JoinTimes  
0 2022-12-03 19:50:52  {2022-12-03 19:50:52}  
1 2022-12-03 20:10:52  {2022-12-03 20:10:52}  
2 2022-12-03 21:47:32  {2022-12-03 21:47:32}

您还可以传递命名聚合:

#do grouping with aggregations
df = df_grp.agg(JoinTimeFirst=('JoinTime','min'),
                JoinTimeLast=('JoinTime','min'),
                JoinTimes=('JoinTime',set)).reset_index() 
print (df)
  Attended           Email    JoinDate       JoinTimeFirst  \
0      Yes    009indrajeet  2022-12-03 2022-12-03 19:50:52   
1      Yes  09871143420.ms  2022-12-03 2022-12-03 20:10:52   
2      Yes       09s.bisht  2022-12-03 2022-12-03 21:47:32   

         JoinTimeLast              JoinTimes  
0 2022-12-03 19:50:52  {2022-12-03 19:50:52}  
1 2022-12-03 20:10:52  {2022-12-03 20:10:52}  
2 2022-12-03 21:47:32  {2022-12-03 21:47:32}
k2arahey

k2arahey2#

new_df=df.dropna(axis=1).rename(columns = {df.columns[3]:'JoinTimeFirst',df.columns[4]:'JoinTimeLast'})
h22fl7wq

h22fl7wq3#

下面的方法更为通用,基本上是针对第一行具有列名的情况设计的

# Setting the columns based on the column 1
import pandas as pd 
import numpy as np
# df = please load the dataframe to the df and assume that the empty values are read as null 
final_col = []
for key, val in dict(df.iloc[0].fillna(0)).items():
     if val == 0 :
        final_col.append(key)
     else:
         final_col.append(val)

df.columns  = final_col
df = df.loc[1:] # removing teh first column 
df.reset_index(drop=True, inplace=True) # Resetting the index to 0
cpjpxq1n

cpjpxq1n4#

您可以像这样使用rename

df = df.rename(columns={'JoinTime': 'JoinTimeFirst', 'JoinTime.1': 'JoinTimeLast'}, inplace=True)

完整的代码,可用于重命名“JoinTime”列、重新排列列的顺序以及将修改后的DataFrame保存到新的CSV文件:

import pandas as pd

# Read in the data, skipping the first row
df = pd.read_csv("data.csv", skiprows=1)

# Rename the 'JoinTime' columns and select the columns in the desired order
df = df[['Attended', 'Email', 'JoinDate', 'JoinTimeFirst', 'JoinTimeLast']]
df = df.rename(columns={'JoinTime': 'JoinTimeFirst', 'JoinTime.1': 'JoinTimeLast'}, inplace=True)

# Save the modified DataFrame to a new CSV file
df.to_csv("modified_data.csv", index=False)

# Print the modified DataFrame
print(df)

相关问题