我已经看过几个关于这个的帖子,但我无法理解merge,join和concat如何解决这个问题.如何合并两个数据帧以查找匹配的索引?
在:
import pandas as pd
import numpy as np
row_x1 = ['a1','b1','c1']
row_x2 = ['a2','b2','c2']
row_x3 = ['a3','b3','c3']
row_x4 = ['a4','b4','c4']
index_arrays = [np.array(['first', 'first', 'second', 'second']), np.array(['one','two','one','two'])]
df1 = pd.DataFrame([row_x1,row_x2,row_x3,row_x4], columns=list('ABC'), index=index_arrays)
print(df1)
Run Code Online (Sandbox Code Playgroud)
出:
A B C
first one a1 b1 c1
two a2 b2 c2
second one a3 b3 c3
two a4 b4 c4
Run Code Online (Sandbox Code Playgroud)
在:
row_y1 = ['d1','e1','f1']
row_y2 = ['d2','e2','f2']
df2 = pd.DataFrame([row_y1,row_y2], columns=list('DEF'), index=['first','second'])
print(df2)
Run Code Online (Sandbox Code Playgroud)
出
D E F
first d1 e1 f1
second d2 …Run Code Online (Sandbox Code Playgroud) .summary()使用 pandas statsmodels的函数时,OLS 回归结果包括以下字段。
coef std err t P>|t| [0.025 0.975]
Run Code Online (Sandbox Code Playgroud)
如何获得标准化系数(不包括截距),类似于 SPSS 中可实现的?
我有一个小时价值的时间序列,我试图每周/每月得出一些基本的统计数据.
如果我们使用以下抽象数据框,则每列都是时间序列:
rng = pd.date_range('1/1/2016', periods=2400, freq='H')
df = pd.DataFrame(np.random.randn(len(rng), 4), columns=list('ABCD'), index=rng)
Run Code Online (Sandbox Code Playgroud)
print df[:5] 收益:
A B C D
2016-01-01 00:00:00 1.521581 0.102335 0.796271 0.317046
2016-01-01 01:00:00 -0.369221 -0.179821 -1.340149 -0.347298
2016-01-01 02:00:00 0.750247 0.698579 0.440716 0.362159
2016-01-01 03:00:00 -0.465073 1.783315 1.165954 0.142973
2016-01-01 04:00:00 1.995332 1.230331 -0.135243 1.189431
Run Code Online (Sandbox Code Playgroud)
我可以打电话:
r = df.resample('W-MON')
Run Code Online (Sandbox Code Playgroud)
然后用:r.min(),r.mean(),r.max(),这些都很好地工作.例如print r.min()[:5]返回:
A B C D
2016-01-04 -2.676778 -2.450659 -2.401721 -3.209390
2016-01-11 -2.710066 -2.372032 -2.864887 -2.387026
2016-01-18 -2.984805 …Run Code Online (Sandbox Code Playgroud) 从创建似乎与此问题重复的内容道歉.我的数据框形状或多或少类似于下面的数据框:
df_lenght = 240
df = pd.DataFrame(np.random.randn(df_lenght,2), columns=['a','b'] )
df['datetime'] = pd.date_range('23/06/2017', periods=df_lenght, freq='H')
unique_jobs = ['job1','job2','job3',]
job_id = [unique_jobs for i in range (1, int((df_lenght/len(unique_jobs))+1) ,1) ]
df['job_id'] = sorted( [val for sublist in job_id for val in sublist] )
df.set_index(['job_id','datetime'], append=True, inplace=True)
Run Code Online (Sandbox Code Playgroud)
print(df[:5]) 收益:
a b
job_id datetime
0 job1 2017-06-23 00:00:00 -0.067011 -0.516382
1 job1 2017-06-23 01:00:00 -0.174199 0.068693
2 job1 2017-06-23 02:00:00 -1.227568 -0.103878
3 job1 2017-06-23 03:00:00 -0.847565 -0.345161
4 job1 2017-06-23 04:00:00 …Run Code Online (Sandbox Code Playgroud) 当尝试根据日期时间索引的值对时间序列执行删除重复时,我正在用头撞墙。
我的功能如下:
def csv_import_merge_T(f):
dfsT = [pd.read_csv(fp, index_col=[0], parse_dates=[0], dayfirst=True, names=['datetime','temp','rh'], header=0) for fp in files]
dfT = pd.concat(dfsT)
#print dfT.head(); print dfT.index; print dfT.dtypes
dfT.drop_duplicates(subset=index, inplace=True)
dfT.resample('H').bfill()
return dfT
Run Code Online (Sandbox Code Playgroud)
其调用者:
inputcsvT = ['./input_csv/A08_KI_T*.csv']
for csvnameT in inputcsvT:
files = glob.glob(csvnameT)
print ('___'); print (files)
t = csv_import_merge_T(files)
print csvT
Run Code Online (Sandbox Code Playgroud)
我收到错误
NameError: global name 'index' is not defined
Run Code Online (Sandbox Code Playgroud)
怎么了?
更新: 当 csv 输入文件(要连接)重叠时,似乎会出现此问题。
inputcsvT = ['./input_csv/A08_KI_T*.csv']获取文件
A08_KI_T5
28/05/2015 17:00,22.973,24.021
...
08/10/2015 13:30,24.368,45.974
A08_KI_T6
08/10/2015 14:00,24.779,41.526
...
10/02/2016 17:00,22.326,41.83
并且它运行正确,而: …
我有一个dataframe t_unit,这是一个pd.read_csv()函数的结果。
datetime B18_LR_T B18_B1_T
24/03/2016 09:00 21.274 21.179
24/03/2016 10:00 19.987 19.868
24/03/2016 11:00 21.632 21.417
24/03/2016 12:00 26.285 24.779
24/03/2016 13:00 26.897 24.779
Run Code Online (Sandbox Code Playgroud)
我正在重新采样数据帧以使用代码计算第5个和第5个百分点:
keys_actual = list(t_unit.columns.values)
for key in keys_actual:
ts_wk = t_unit[key].resample('W-MON')
ts_wk_05p = ts_wk.apply(lambda x: x.quantile(0.05)).round(decimals=1).rename(key+'_05p', inplace=True)
ts_wk_95p = ts_wk.apply(lambda x: x.quantile(0.95)).round(decimals=1).rename(key+'_95p', inplace=True)
Run Code Online (Sandbox Code Playgroud)
一切正常,但是当我通过的方式向数据框添加一列时pd.concat:
datetime B18_LR_T B18_B1_T ext_T
24/03/2016 09:00 21.274 21.179 6.9
24/03/2016 10:00 19.987 19.868 7.5
24/03/2016 11:00 21.632 21.417 9.1
24/03/2016 12:00 26.285 24.779 9.9
24/03/2016 13:00 …Run Code Online (Sandbox Code Playgroud) 我试图解析一个文本文件,将其转换为pandas数据帧.该文件(包括空行):
HEADING1
value 1
HEADING2
value 2
HEADING1,
value 11
HEADING2
value 12
Run Code Online (Sandbox Code Playgroud)
应转换为dataframe:
HEADING1, HEADING2
value 1, value 2
value 11, value 12
Run Code Online (Sandbox Code Playgroud)
我试过以下代码.但是,我不确定使用converters可行吗?
df = pd.read_table(textfile, header=None, skip_blank_lines=True, delimiter='\n',
# converters= 'what should I use?',
names= 'HEADING1, HEADING2'.split() )
Run Code Online (Sandbox Code Playgroud) 我正在尝试合并和附加不同的时间序列,从 csv 文件导入它们。我尝试过以下基本代码:
import pandas as pd
import numpy as np
import glob
import csv
import os
path = r'./A08_csv' # use your path
#all_files = glob.glob(os.path.join(path, "A08_B1_T5.csv"))
df5 = pd.read_csv('./A08_csv/A08_B1_T5.csv', parse_dates={'Date Time'})
df6 = pd.read_csv('./A08_csv/A08_B1_T6.csv', parse_dates={'Date Time'})
print len(df5)
print len(df6)
df = pd.concat([df5],[df6], join='outer')
print len(df)
Run Code Online (Sandbox Code Playgroud)
结果是:
12755 (df5)
24770 (df6)
12755 (df)
Run Code Online (Sandbox Code Playgroud)
df 不应该与两个文件中最长的一个一样长吗(就 ['Date Time'] 列上的值而言,它们有很多共同的行)?
我尝试根据日期时间对数据进行索引,添加此行:
#df5.set_index(pd.DatetimeIndex(df5['Date Time']))
Run Code Online (Sandbox Code Playgroud)
但是我收到了错误:
KeyError: 'Date Time'
Run Code Online (Sandbox Code Playgroud)
关于为什么会发生这种情况有任何线索吗?
我找到并改编了以下代码片段,用于生成线性回归的诊断图。这是目前使用以下功能完成的:
def residual_plot(some_values):
plot_lm_1 = plt.figure(1)
plot_lm_1 = sns.residplot()
plot_lm_1.axes[0].set_title('title')
plot_lm_1.axes[0].set_xlabel('label')
plot_lm_1.axes[0].set_ylabel('label')
plt.show()
def qq_plot(residuals):
QQ = ProbPlot(residuals)
plot_lm_2 = QQ.qqplot()
plot_lm_2.axes[0].set_title('title')
plot_lm_2.axes[0].set_xlabel('label')
plot_lm_2.axes[0].set_ylabel('label')
plt.show()
Run Code Online (Sandbox Code Playgroud)
用类似的东西调用:
plot1 = residual_plot(value_set1)
plot2 = qq_plot(value_set1)
plot3 = residual_plot(value_set2)
plot4 = qq_plot(value_set2)
Run Code Online (Sandbox Code Playgroud)
如何创建subplots以便将这 4 个图显示在 2x2 网格中?
我试过使用:
fig, axes = plt.subplots(2,2)
axes[0,0].plot1
axes[0,1].plot2
axes[1,0].plot3
axes[1,1].plot4
plt.show()
Run Code Online (Sandbox Code Playgroud)
但收到错误:
AttributeError: 'AxesSubplot' object has no attribute 'plot1'
Run Code Online (Sandbox Code Playgroud)
我应该从函数内部还是其他地方设置轴属性?
pandas ×8
python ×7
datetime ×2
multi-index ×2
quantile ×2
resampling ×2
time-series ×2
coefficients ×1
concat ×1
converters ×1
csv ×1
duplicates ×1
group-by ×1
grouping ×1
indexing ×1
matplotlib ×1
merge ×1
parsing ×1
regression ×1
statsmodels ×1
subplot ×1