python - 复杂的行和列操作 Pandas

标签 python file csv pandas time-series

我正在尝试同时执行行和列操作。我有一个时间序列数据。我确实检查了这里和文档中的几乎所有示例,但运气不佳,而且比以前更加困惑。

我有两个文件都在同一个路径

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.csvfile_2.csv在执行以下操作时作为新列:

  1. Nos=123的值它发生了3file_2.csv所以除以相应的值即624/3 = 208 .

  2. 现在通过添加 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/

相关文章:

python - 页面排名转换矩阵的高效实现

python - 在字典中查找最大值

python - 发送请求时出现证书错误

python - 获取文件Python中某个短语的行号

html - 编辑 HTML 文件,发送 HTML Email iOS

csv - SQLState = S1000,NativeError = 0 错误 = [Microsoft][SQL Server Native Client 10.0]BCP 数据文件中遇到意外的 EOF

python - 如何使用 reg.compile 匹配文本的精确单词

c - 关闭文件时出现"Double free or corruption(out)"?

java - 我如何比较java中没有格式和数据差异标题的csv

python - 将包含多行数据的 .txt 转换为 .csv