python文件可以包括任何数据内容_python 文件数据合并(数据行不对应)?

这里我们讨论如何利用concat方法进行简单的数据拼接。

import pandas as pd

ser1 = pd.Series(['A','B','C'], index=[1,2,3])

ser2 = pd.Series(['D','E','F'], index=[4,5,6])

ser = pd.concat([ser1,ser2])

print(ser1)

print(ser2)

print(ser)

1 A

2 B

3 C

dtype: object

4 D

5 E

6 F

dtype: object

1 A

2 B

3 C

4 D

5 E

6 F

dtype: object

在这个例子中,我们简单的对Series进行了拼接,我们看到默认的情况是逐行进行合并操作,对DataFrame对象进行简单拼接也是一样。

import pandas as pd

df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'}})

df2 = pd.DataFrame({'A':{'3':'A3','4':'A4'},'B':{'3':'B3','4':'B4'}})

print(df1)

print(df2)

print(pd.concat([df1,df2]))

A B

1 A1 B1

2 A2 B2

A B

3 A3 B3

4 A4 B4

A B

1 A1 B1

2 A2 B2

3 A3 B3

4 A4 B4

通过这种方法,我们也是以逐行的方式对两个DataFrame进行了合并。

很自然的,相对于逐行进行合并,也可以按逐列的方式进行合并,类比之前讲过的,加上一个axis参数即可:

import pandas as pd

import numpy as np

df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'}})

df2 = pd.DataFrame({'C':{'1':'C1','2':'C4'},'D':{'1':'D1','2':'D2'}})

print(df1)

print(df2)

print(pd.concat([df1,df2], axis=1))

A B

1 A1 B1

2 A2 B2

C D

1 C1 D1

2 C4 D2

A B C D

1 A1 B1 C1 D1

2 A2 B2 C4 D2

上面的例子举得比较特殊,刻意设置了两个DataFrame数据的索引是不同的,如果恰好他们的索引相同,会不会出问题。

这个问题提的不错,Pandas中concat方法的一个很大的特点就是保留索引,合并后的结果里各行的索引与合并前的索引保持一致。

import pandas as pd

df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'}})

df2 = pd.DataFrame({'A':{'1':'A3','2':'A4'},'B':{'1':'B3','2':'B4'}})

print(pd.concat([df1,df2]))

A B

1 A1 B1

2 A2 B2

1 A3 B3

2 A4 B4

可以看到,结果并没有报错,而且确实是保留了合并前的索引。但是这并不是我们想看到的,因为这样一来,A1、A3两项的索引就是完全一样了。

那就眼睁睁的看着这种情况发生吗?

当然不是,解决的方法有两种:

第一种就是忽略这种索引,如果索引是这种没有实际意义的流水ID,那么我们可以让他们顺次的往下排列,从而避免重复,设置一个ignore_index即可实现。

import pandas as pd

df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'}})

df2 = pd.DataFrame({'A':{'1':'A3','2':'A4'},'B':{'1':'B3','2':'B4'}})

print(df1)

print(df2)

print(pd.concat([df1,df2], ignore_index=True))

A B

1 A1 B1

2 A2 B2

A B

1 A3 B3

2 A4 B4

A B

0 A1 B1

1 A2 B2

2 A3 B3

3 A4 B4

那如果我觉得原来的索引代表了实际意义,不能忽略呢?

别急,第二种方法就是利用多级索引的方式来保留原索引。

import pandas as pd

df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'}})

df2 = pd.DataFrame({'A':{'1':'A3','2':'A4'},'B':{'1':'B3','2':'B4'}})

print(df1)

print(df2)

print(pd.concat([df1,df2], keys=['x','y']))

A B

1 A1 B1

2 A2 B2

A B

1 A3 B3

2 A4 B4

A B

x 1 A1 B1

2 A2 B2

y 1 A3 B3

2 A4 B4

还漏了一种情况,就是如果列名不完全一致应该如何处理?

我们继续看看在合并的过程中,列会出现什么现象。

import pandas as pd

df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'},'C':{'1':'C1','2':'C2'}})

df2 = pd.DataFrame({'B':{'3':'B3','4':'B4'},'C':{'3':'C3','4':'C4'},'D':{'3':'D3','4':'D4'}})

print(df1)

print(df2)

print(pd.concat([df1,df2]))

A B C

1 A1 B1 C1

2 A2 B2 C2

B C D

3 B3 C3 D3

4 B4 C4 D4

A B C D

1 A1 B1 C1 NaN

2 A2 B2 C2 NaN

3 NaN B3 C3 D3

4 NaN B4 C4 D4

从结果中我们可以看出,我们这种默认的合并方式是对所有的输入列取并集,如果在某个位置上值缺失,则用NaN值来代替。

如果我们想换一种方式,对输入列取交集,这样就不会出现NaN值了。

import pandas as pd

df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'},'C':{'1':'C1','2':'C2'}})

df2 = pd.DataFrame({'B':{'3':'B3','4':'B4'},'C':{'3':'C3','4':'C4'},'D':{'3':'D3','4':'D4'}})

print(df1)

print(df2)

print(pd.concat([df1,df2], join='inner'))

A B C

1 A1 B1 C1

2 A2 B2 C2

B C D

3 B3 C3 D3

4 B4 C4 D4

B C

1 B1 C1

2 B2 C2

3 B3 C3

4 B4 C4

当然,我们还可以指定任何一个合并项的列来作为最后结果的使用列:

import pandas as pd

df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'},'C':{'1':'C1','2':'C2'}})

df2 = pd.DataFrame({'B':{'3':'B3','4':'B4'},'C':{'3':'C3','4':'C4'},'D':{'3':'D3','4':'D4'}})

print(df1)

print(df2)

print(pd.concat([df1, df2], join_axes=[df1.columns]))

A B C

1 A1 B1 C1

2 A2 B2 C2

B C D

3 B3 C3 D3

4 B4 C4 D4

A B C

1 A1 B1 C1

2 A2 B2 C2

3 NaN B3 C3

4 NaN B4 C4

关于数据科学更系统、更深入的探讨可进入我们的专栏《Python数据科学之路》:酱油哥:来吧,一起踏上Python数据科学之路​zhuanlan.zhihu.comv2-d6447864fbc755396dbd5f78e0a85fd6_180x120.jpg

本专栏模仿美剧剧集编排分为五季,第一季:Python编程语言核心基础、第二季:Python数据分析基本工具、第三季:Python语言描述的数学基础、第四季:机器学习典型算法专题、第五季:实战热点深度应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个简单的Python程序,可以将csv文件数据按照月初、月中、月末对应数据合并。首先,程序会读取csv文件,然后将每一的日期转换成Python中的datetime对象,以便进日期计算。接着,程序会根据日期判断每一数据所属的日期范围,并将其加入到对应的列表中。最后,程序将三个列表中的数据合并,并将结果写入新的csv文件中。 ```python import csv from datetime import datetime # 打开csv文件 with open('data.csv', 'r') as f: reader = csv.reader(f) header = next(reader) # 读取标题 data = list(reader) # 读取数据 # 初始化三个列表,用于存放月初、月中、月末的数据 month_start = [] month_mid = [] month_end = [] # 遍历数据 for row in data: date = datetime.strptime(row[0], '%Y-%m-%d') # 将日期字符串转换为datetime对象 if date.day <= 10: month_start.append(row) elif date.day <= 20: month_mid.append(row) else: month_end.append(row) # 合并三个列表中的数据 merged_data = month_start + month_mid + month_end # 将合并后的数据写入新的csv文件 with open('merged_data.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow(header) writer.writerows(merged_data) ``` 在这个程序中,我们假设csv文件的第一列是日期,日期格式为"YYYY-MM-DD"。如果您的csv文件的格式不同,您可能需要修改代码以适应您的文件格式。 ### 回答2: 你可以使用Python的pandas库来实现这个任务。下面是一个示例代码: ```python import pandas as pd # 读取CSV文件 data = pd.read_csv('data.csv') # 将日期列转换为日期时间格式 data['日期'] = pd.to_datetime(data['日期']) # 按照月份对数据分组 data_grouped = data.groupby(data['日期'].dt.to_period('M')) # 分别获取每个月的月初、月中和月末的数据 data_start = data_grouped.first() data_mid = data_grouped.mean() data_end = data_grouped.last() # 合并数据 merged_data = pd.concat([data_start, data_mid, data_end], keys=['月初', '月中', '月末']) # 将合并后的数据保存到CSV文件 merged_data.to_csv('merged_data.csv') ``` 通过以上代码,你可以实现读取一个名为"data.csv"的CSV文件,并将其中的日期数据按照月初、月中和月末分别合并为一个新的DataFrame。最后,将合并后的数据保存到名为"merged_data.csv"的CSV文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值