df_director = df['表演者'].str.split(' / ', expand=True) drt1 = df_director.apply(pd.value_counts).fillna('0') drt1 = drt1.astype(np.int64) drt1['count'] = drt1.sum(axis=1) drt1.sort_values('count', ascending=False, inplace=True) drt1.drop([0,1], axis=1, inplace=True) drt1.index.name = '表演者' display(drt1[:10])
时间: 2024-01-10 19:03:11 浏览: 21
这段代码的作用是将数据框(df)中的"表演者"列按照"/"进行拆分,并统计每个表演者的出现次数。首先,通过`str.split(' / ', expand=True)`将"表演者"列拆分成多列。然后,使用`pd.value_counts`函数计算每个表演者出现的次数,并用`fillna('0')`将缺失值填充为0。接下来,将结果转换为整数类型(`astype(np.int64)`),并计算每个表演者的总次数并添加到结果中(`drt1['count'] = drt1.sum(axis=1)`)。最后,按照总次数降序排列(`drt1.sort_values('count', ascending=False, inplace=True)`),并去掉不需要的列(`drt1.drop([0,1], axis=1, inplace=True)`)。最后的结果会显示前10个表演者及其出现次数。
相关问题
data = data[0].str.split(',', expand=True)解读
这段代码的作用是将一维的字符串数据按照逗号分隔符进行拆分,并将拆分后的结果转换为二维的DataFrame数据。具体解释如下:
- `data[0]`:表示取出DataFrame中第一列的数据,它是一个Series类型的数据。
- `str.split(',', expand=True)`:表示对这个Series类型的数据进行字符串拆分操作,其中`','`表示按照逗号进行拆分,`expand=True`表示将拆分后的结果展开成DataFrame格式。例如,如果原来的数据是`['a,b,c', 'd,e,f']`,那么拆分后的结果就是一个2行3列的DataFrame,其中第一行是`['a', 'b', 'c']`,第二行是`['d', 'e', 'f']`。
- `data = data[0].str.split(',', expand=True)`:表示将拆分后的二维DataFrame赋值给原来的DataFrame变量`data`,从而完成了将一维字符串数据拆分成二维DataFrame的过程。
import numpy as np from datetime import datetime, timedelta import pandas as pd test = pd.read_excel("C:\\Users\\1data\\Desktop\\DBM成本收入核算\\test.xlsx") start_date = pd.to_datetime(test['合同开始日期']) end_date = pd.to_datetime(test['合同截止日期']) test['合同周期月数'] = round((end_date - start_date) / np.timedelta64(1, 'M')) start_date_col = '合同开始日期' end_date_col = '合同截止日期' new_col = '日期' for index, row in test.iterrows(): start_date = pd.to_datetime(row[start_date_col]) end_date = pd.to_datetime(row[end_date_col]) date_list = [] if start_date.day <= 15: while start_date <= end_date: date_list.append(start_date) start_date = start_date + timedelta(days=30) else: start_date = start_date + timedelta(days=30) while start_date <= end_date + timedelta(days=30): date_list.append(start_date) start_date = start_date + timedelta(days=30) test.loc[index, new_col] = ','.join([str(date.date()) for date in date_list]) df_tmp=test['日期'].str.split(',',expand=True) df_tmp=df_tmp.stack() df_tmp = df_tmp.reset_index(level=1,drop=True) df_tmp.name='日期' df_new = test.drop(['日期'], axis=1).join(df_tmp).reset_index().drop(columns='index') print(df_new) df_new.to_excel('income_test.xlsx',index=False) 将这段代码导出的excel中合同开始日期字段不显示时分秒且新增日期字段的取年月的字段合同周期年月
要将导出的 Excel 中的合同开始日期字段只显示年月日,可以使用 pandas 的 to_datetime 方法中的 strftime 函数将日期格式化为字符串再导出到 Excel 中。修改代码如下:
```
import numpy as np
from datetime import datetime, timedelta
import pandas as pd
test = pd.read_excel("C:\\Users\\1data\\Desktop\\DBM成本收入核算\\test.xlsx")
start_date = pd.to_datetime(test['合同开始日期'])
end_date = pd.to_datetime(test['合同截止日期'])
test['合同周期月数'] = round((end_date - start_date) / np.timedelta64(1, 'M'))
start_date_col = '合同开始日期'
end_date_col = '合同截止日期'
new_col = '日期'
for index, row in test.iterrows():
start_date = pd.to_datetime(row[start_date_col])
end_date = pd.to_datetime(row[end_date_col])
date_list = []
if start_date.day <= 15:
while start_date <= end_date:
date_list.append(start_date)
start_date = start_date + timedelta(days=30)
else:
start_date = start_date + timedelta(days=30)
while start_date <= end_date + timedelta(days=30):
date_list.append(start_date)
start_date = start_date + timedelta(days=30)
# 格式化日期字符串为年月日
date_str_list = [date.strftime('%Y-%m-%d') for date in date_list]
test.loc[index, new_col] = ','.join(date_str_list)
# 将日期字段拆分为多列
df_tmp = test['日期'].str.split(',', expand=True)
df_tmp = df_tmp.stack()
df_tmp = df_tmp.reset_index(level=1, drop=True)
df_tmp.name = '日期'
# 将拆分后的日期列与原始 DataFrame 合并
df_new = pd.concat([test.drop(['日期'], axis=1), df_tmp], axis=1)
df_new = df_new.reset_index().drop(columns='index')
# 计算合同周期年月
df_new['合同周期年月'] = df_new['合同周期月数'].apply(lambda x: f"{int(x//12)}年{int(x%12)}月")
# 导出到 Excel
df_new.to_excel('income_test.xlsx', index=False)
```
这样导出的 Excel 文件中的合同开始日期字段只显示年月日,而新增日期字段的取年月的字段合同周期年月也被计算出来了。