我正在尝试同时执行行和列操作。我有一个时间序列数据。我确实检查了这里和文档中的几乎所有示例,但运气不佳,而且比以前更加困惑。
我有两个文件都在同一个路径
Path = '/'
File_1.csv
Nos,00:00:00,12:00:00
123,5245,624
125,4534,65
567,642,7522
File_2.csv
Nos,00:00:00
123,20
123,20
123,20
125,50
125,50
567,500
567,500
567,500
567,500
567,500
预期的输出是合并 col[last]
计数 file_1.csv
至 file_2.csv
在执行以下操作时作为新列:
取
Nos=123
的值它发生了3
次file_2.csv
所以除以相应的值即624/3 = 208
.现在通过添加
00:00:00
的值来放置这个新值来自对应于Nos
的同一行在标题为col[last]
的新列中来自file_1.csv
.即208+20=228
现在附加file_2.csv
看起来像:
File_2.csv
Nos,00:00:00,12:00:00
123,20,228
123,20,228
123,20,228
125,50,82/83 #float to be rounded off
125,50,82/83
567,500,2004 #float rounded off
567,500,2004
567,500,2004
567,500,2004
567,500,2004
从哪里开始理解这看起来 super 复杂。任何推进编写代码的建议都会有很大的帮助。提前致谢。
最佳答案
将两个数据框合并为一个:
In [34]: df3 = pd.merge(df2, df1[['Nos', '12:00:00']], on=['Nos'], how='left')
In [35]: df3
Out[35]:
Nos 00:00:00 12:00:00
0 123 20 624
1 123 20 624
2 123 20 624
3 125 50 65
4 125 50 65
5 567 500 7522
6 567 500 7522
7 567 500 7522
8 567 500 7522
9 567 500 7522
然后您可以执行groupby/transform
来计算每个组中有多少项:
count = df3.groupby(['Nos'])['12:00:00'].transform('count')
您希望计算的值可以表示为
df3['12:00:00'] = df3['00:00:00'] + df3['12:00:00']/count
例如,
import pandas as pd
df1 = pd.read_csv('File_1.csv')
df2 = pd.read_csv('File_2.csv')
last1, last2 = df1.columns[-1], df2.columns[-1]
df3 = pd.merge(df2, df1[['Nos', last1]], on=['Nos'], how='left')
count = df3.groupby(['Nos'])[last1].transform('count')
df3[last1] = df3[last2] + df3[last1]/count
print(df3)
产量
Nos 00:00:00 12:00:00
0 123 20 228.0
1 123 20 228.0
2 123 20 228.0
3 125 50 82.5
4 125 50 82.5
5 567 500 2004.4
6 567 500 2004.4
7 567 500 2004.4
8 567 500 2004.4
9 567 500 2004.4
或者,你可以使用
df3[last1] = df3.groupby(['Nos']).apply(lambda x: x[last2] + x[last1]/len(x) ).values
代替
count = df3.groupby(['Nos'])[last1].transform('count')
df3[last1] = df3[last2] + df3[last1]/count
但是,它比较慢,因为 groupby/apply
对每个组进行一次加法和除法,而
df3[last1] = df3[last2] + df3[last1]/count
正在对整列执行加法和除法。如果有很多组,性能差异可能会很大。将两个数据帧合并为一个:
In [34]: df3 = pd.merge(df2, df1[['Nos', '12:00:00']], on=['Nos'], how='left')
In [35]: df3
Out[35]:
Nos 00:00:00 12:00:00
0 123 20 624
1 123 20 624
2 123 20 624
3 125 50 65
4 125 50 65
5 567 500 7522
6 567 500 7522
7 567 500 7522
8 567 500 7522
9 567 500 7522
然后您可以执行groupby/transform
来计算每个组中有多少项:
count = df3.groupby(['Nos'])['12:00:00'].transform('count')
您希望计算的值可以表示为
df3['12:00:00'] = df3['00:00:00'] + df3['12:00:00']/count
例如,
import pandas as pd
df1 = pd.read_csv('File_1.csv')
df2 = pd.read_csv('File_2.csv')
last1, last2 = df1.columns[-1], df2.columns[-1]
df3 = pd.merge(df2, df1[['Nos', last1]], on=['Nos'], how='left')
count = df3.groupby(['Nos'])[last1].transform('count')
df3[last1] = df3[last2] + df3[last1]/count
print(df3)
产量
Nos 00:00:00 12:00:00
0 123 20 228.0
1 123 20 228.0
2 123 20 228.0
3 125 50 82.5
4 125 50 82.5
5 567 500 2004.4
6 567 500 2004.4
7 567 500 2004.4
8 567 500 2004.4
9 567 500 2004.4
或者,你可以使用
df3[last1] = df3.groupby(['Nos']).apply(lambda x: x[last2] + x[last1]/len(x) ).values
代替
count = df3.groupby(['Nos'])[last1].transform('count')
df3[last1] = df3[last2] + df3[last1]/count
但是,它比较慢,因为 groupby/apply
对每个组进行一次加法和除法,而
df3[last1] = df3[last2] + df3[last1]/count
正在对整列执行加法和除法。如果有很多组,性能差异可能会很大:
In [52]: df3 = pd.concat([df3]*1000)
In [56]: df3['Nos'] = np.random.randint(1000, size=len(df3))
In [57]: %timeit using_transform(df3)
100 loops, best of 3: 6.49 ms per loop
In [58]: %timeit using_apply(df3)
1 loops, best of 3: 270 ms per loop
关于python - 复杂的行和列操作 Pandas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31080167/