原因:
自己在看利用pandas进行数据分析这一书籍的时候,生成df的部分的代码是不完整的,但是展示df的地方,df是完整展示的。所以在此编写python程序,实现复制粘贴字符串形式的df来生成DataFrame形式的df。
-
目标是这个样子的
image.png
复制后使用input方法读取后是这样的
image.png - 通过观察得到
- 第一个数字的左边的两个单词是columns的组成元素
- 每条记录的不同属性之间由多个\t间隔。组成同一个属性值的不同单词之间只有一个\t
- 每条记录都是整数开头,浮点数结尾,且开头的整数为index
- 实现自己目标的思路
- 利用正则匹配获取columns的所有元素
- 利用正则获取所有的记录,并且存储到数组中
- 获取数组记录的后两项作为df的值
def handle(astring,nums):#第一个是输入的字符串,第二个是列数
# 获取colums,以列表形式存储
pattern1 = re.compile(r'.*?[0-9]')# .*匹配任意字符,?非贪婪匹配,[0-9]以数值结尾
k = re.findall(pattern1,astring)[0]# list对象的第一个item是需要的
pattern2 = re.compile(r'[a-zA-Z]+')#[a-zA-Z]匹配字母,+表示至少出现一次,这里是取出k中的所有单词
column_list = re.findall(pattern2,k)#columns 对应的列表生成
#print(column_list) 测试用代码
#获取df的每一行,在这里我称之为记录
pattern3 = re.compile('[0-9].*?\.[0-9]')# [0-9]是数值开头,\.[0-9]是以浮点数结尾,.*?是非贪婪匹配中间包括任意字符
record_list = re.findall(pattern3,astring)# 生词record的列表,每条record是'0\t\t\t\t\t\t\t\tbacon\t\t\t\t\t4.0'样子的
#处理record得到记录
pattern4 = re.compile(r'\t{2,}')
data_df = [] # 这里本来是想用Dataframe逐行添加数据实现的,但是自己目前不知道怎么做
for record in record_list:
t = pattern4.split(record)
k = list(map(lambda x: x.replace('\t',' '), t)) # 将字符串中的\t替换为 ' '
data_df.append(k[1:nums+1])
df = pd.DataFrame(data_df,columns=column_list)
return df
astring = input('请在此输入字符串:')
num = eval(input('请在此输入列数(注:不包括index列的列数):'))
df = handle(astring,2)
结果如下所示image.png
总结:系统的学习太重要了,总是零散的学习,这也要查,那也要查,太浪费时间了