pandas 取开头为
时间: 2024-01-09 20:01:48 浏览: 84
在pandas中,要取开头为某个值的数据可以使用.str.startswith()方法来进行操作。这个方法可以用于Series或DataFrame中的字符串列,用来筛选出开头为特定值的数据。
例如,我们有一个包含员工姓名的DataFrame,想要筛选出所有名字以“王”开头的员工。可以使用如下代码来实现:
```python
import pandas as pd
data = {'员工姓名': ['王小明', '张三', '王大锤', '李四', '王花花']}
df = pd.DataFrame(data)
result = df[df['员工姓名'].str.startswith('王')]
print(result)
```
以上代码将会输出如下结果:
```
员工姓名
0 王小明
2 王大锤
4 王花花
```
可以看到,通过使用.str.startswith()方法,我们成功筛选出了员工姓名开头为“王”的所有数据。
总结来说,pandas中的.str.startswith()方法非常方便,能够快速帮助我们筛选出开头为特定值的数据,是数据分析和处理中常用的方法之一。
相关问题
如何在Python中使用pandas库正确读取Excel文件,并根据特定规则处理数据?例如,数据应包含学校(以C92024开头,后跟两位数学校编号如01、02),学生编号(以001、002开始,也是两位数),请解释步骤和代码示例。
在Python中使用pandas库读取Excel文件并处理这类数据,可以按照以下步骤进行:
1. 安装所需的库:
```bash
pip install pandas openpyxl
```
2. 导入pandas库:
```python
import pandas as pd
```
3. 读取Excel文件:
假设文件名为`example.xlsx`,你可以使用`read_excel`函数读取:
```python
data = pd.read_excel('example.xlsx', engine='openpyxl')
```
4. 数据预处理:
对于学校和学生编号的处理,你可以创建新列并应用特定的格式规则。假设学校和学生编号分别在`School`和`StudentID`列,你可以这样做:
- 创建一个新的学校编号列,将所有学校名称从"C9202*"替换为"C92024加上对应的学校编号:
```python
data['New_School'] = data['School'].str.replace(r'^C9202[0-9]$', 'C92024').astype(str) + data['School'].apply(lambda x: str(int(x.split('.')[1])) if '.' in x else str(int(x[-2:])))
```
- 同样处理学生编号:
```python
data['New_StudentID'] = 'C92024' + data['StudentID'].apply(lambda x: str(int(x[3:]) if len(x) > 3 else x))
```
这里假设学校编号在小数点后(如果有小数点),如果没有则直接取最后两位作为编号;学生编号直接去掉前三位(如果有的话)。
5. 检查数据:
可以查看处理后的数据以确认是否符合预期:
```python
print(data[['School', 'New_School', 'StudentID', 'New_StudentID']])
```
6. 保存处理后的数据:
```python
data.to_excel('formatted_data.xlsx', index=False)
```
写出python代码,用argparse。能在任何文件夹读取Log。具体如下: 1.读取log,当读取到最后一次出现"My name is kitty"时,从下一行开始读 2.删除所有重复的行,只留第一行 3.第一行按照正则规则1分列后,才知道有多少列,分列符号也不知道有几个空格。写入新的CSV文件Output 4.从下一行开始按照正则规则2分列后,才知道有多少列,,分列符号也不知道有几个空格。继续写入新的CSV文件Output 5.读取CSV文件Output 6.把标题行分为4类,第一类是标题为ABC,DFG的2列,第二类是CAT开头的几列,第三类是DOG开头的几列,第四类是Fish开头的几列 7.把4类标题画成4个曲线图,标注每条线的标题
下面是实现以上要求的 Python 代码,使用了 argparse、pandas、re、os、matplotlib 库:
```python
import argparse
import pandas as pd
import re
import os
import matplotlib.pyplot as plt
# 定义正则表达式
REGEX1 = r'(?P<col1>[A-Za-z]+)\s+(?P<col2>\d+)\s+(?P<col3>\d+\.\d+)\s+(?P<col4>\d+\.\d+)'
REGEX2 = r'(?P<col1>\d+-\d+-\d+\s+\d+:\d+:\d+)\s+(?P<col2>[A-Za-z]+)\s+(?P<col3>\d+\.\d+)\s+(?P<col4>[A-Za-z]+)'
# 定义函数:读取 log 文件,返回从"My name is kitty"下一行开始的内容
def read_log_file(file_path):
with open(file_path, 'r') as f:
lines = f.readlines()
for i, line in enumerate(lines):
if "My name is kitty" in line:
return lines[i+1:]
return []
# 定义函数:删除重复行,只保留第一行
def remove_duplicate_rows(df):
return df.drop_duplicates(keep='first')
# 定义函数:将数据按正则表达式1分列,并返回 DataFrame 对象
def parse_data1(lines):
# 取第一行
line = lines[0].strip()
# 匹配列名
columns = list(re.findall(REGEX1, line)[0])
# 读取数据,生成 DataFrame 对象
df = pd.DataFrame([re.findall(REGEX1, line)[0]])
for line in lines[1:]:
line = line.strip()
data = list(re.findall(REGEX1, line)[0])
df.loc[len(df)] = data
# 重命名列名
df.columns = columns
return df
# 定义函数:将数据按正则表达式2分列,并返回 DataFrame 对象
def parse_data2(lines):
# 取第一行
line = lines[0].strip()
# 匹配列名
columns = list(re.findall(REGEX2, line)[0])
# 读取数据,生成 DataFrame 对象
df = pd.DataFrame([re.findall(REGEX2, line)[0]])
for line in lines[1:]:
line = line.strip()
data = list(re.findall(REGEX2, line)[0])
df.loc[len(df)] = data
# 重命名列名
df.columns = columns
return df
# 定义函数:将 DataFrame 对象写入 CSV 文件
def write_dataframe_to_csv(df, file_path):
df.to_csv(file_path, index=False)
# 定义函数:读取 CSV 文件,返回 DataFrame 对象
def read_csv_file(file_path):
return pd.read_csv(file_path)
# 定义函数:根据列名分类,将 DataFrame 分成 4 个子数据集,并绘图
def plot_data(df):
# 分类
columns = df.columns.tolist()
cols_type1 = ['ABC', 'DFG']
cols_type2 = [col for col in columns if col.startswith('CAT')]
cols_type3 = [col for col in columns if col.startswith('DOG')]
cols_type4 = [col for col in columns if col.startswith('Fish')]
# 绘图
plt.figure()
for col in cols_type1:
plt.plot(df[col], label=col)
plt.legend()
plt.title('Type 1')
plt.show()
plt.figure()
for col in cols_type2:
plt.plot(df[col], label=col)
plt.legend()
plt.title('Type 2')
plt.show()
plt.figure()
for col in cols_type3:
plt.plot(df[col], label=col)
plt.legend()
plt.title('Type 3')
plt.show()
plt.figure()
for col in cols_type4:
plt.plot(df[col], label=col)
plt.legend()
plt.title('Type 4')
plt.show()
# 定义 main 函数
def main():
# 定义命令行参数
parser = argparse.ArgumentParser(description='Process log file and generate plots.')
parser.add_argument('file_path', type=str, help='path of the log file')
parser.add_argument('output_file', type=str, help='path of the output CSV file')
args = parser.parse_args()
# 读取 log 文件
lines = read_log_file(args.file_path)
# 删除重复行
lines = remove_duplicate_rows(lines)
# 将数据按正则表达式1分列,并写入 CSV 文件
df1 = parse_data1(lines)
write_dataframe_to_csv(df1, args.output_file)
# 从下一行开始,将数据按正则表达式2分列,并写入 CSV 文件
df2 = parse_data2(lines[1:])
write_dataframe_to_csv(df2, args.output_file)
# 读取 CSV 文件
df = read_csv_file(args.output_file)
# 将 DataFrame 按列名分类,并绘图
plot_data(df)
# 执行 main 函数
if __name__ == '__main__':
main()
```
在命令行中执行以下命令:
```
python script.py input.log output.csv
```
其中,`script.py` 是脚本文件名,`input.log` 是输入的 log 文件,`output.csv` 是输出的 CSV 文件。
阅读全文