2017-02-22 21 views
2

У меня есть dataframe, DF1, как показано ниже:Как создать диаграмму рассеяния для нескольких переменных из двух фреймов данных?

Observed PeakFlow (cfs)  Modelled Peak Flow (cfs) 
    9.78768      10.93963 
    1.999368      2.037152 
    11.63652      8.541796 
    3.237471      3.970588 
    54.04929      22.94427 
    4.68197      3.139319 
    16.41346      12.17337 
    14.97399      7.224458 
    2.114172      5.775542 
    22.80021      22.69659 
    25.3347      13.0805 
    33.4092      11.3452 
    13.81051      7.640867 
    6.794793      4.26161 
    9.008561      6.634675 
    5.957804      4.176471 
    2.337406      2.071208 
    32.6419      4.368421 
    3.567871      2.894737 
    5.776844      3.0387 
    39.54993      5.849845 
    4.511765      2.28483 
    6.989101      3.218266 
    14.63979      9.024768 

Я также другое dataframe, df2, как показано ниже:

 1-1 Match | -15% Peak Flow | +25% Peak Flow 
     ----------------------------------------------------- 
     X-Axis| Y-Axis | X-Axis| Y-Axis | X-Axis| Y-Axis 
     ----------------------------------------------------- 
      0 | 0  |  0 | 0  |  0 | 0 
     200 | 200 | 200 | 170 |  200 | 250 

Я хотел бы иметь диаграмму рассеяния этих 2 dataframes. Желаемый вывод показан на рисунке ниже. Как это можно сделать?

enter image description here

Когда я загрузить df2 в CSV-файл я получаю, как показано на рисунке ниже. Как удалить удаленную часть и использовать ее как объединенный столбец, как показано в коде?

enter image description here

ответ

1

Вы можете использовать:

print (df2) 
1-1 Match  -15% Peak Flow  +25% Peak Flow  
    X-Axis Y-Axis   X-Axis Y-Axis   X-Axis Y-Axis 
0   0  0    0  0    0  0 
1  200 200   200 170   200 250 

print (df2.columns) 
MultiIndex(levels=[['+25% Peak Flow', '-15% Peak Flow', '1-1 Match'], ['X-Axis', 'Y-Axis']], 
      labels=[[2, 2, 1, 1, 0, 0], [0, 1, 0, 1, 0, 1]]) 

ax = df.plot.scatter(x='Modelled Peak Flow (cfs)', y='Observed PeakFlow (cfs)', s=50) 

for i, df3 in df2.groupby(level=0, axis=1): 
    df3 = df3.set_index([(i, 'X-Axis')]) 
    df3.index.name = None 
    df3.columns = [i] 
# print (df3) 
    df3.plot(ax=ax) 

graph

Если необходимо настроить colors и markers:

ax = df.plot.scatter(x='Modelled Peak Flow (cfs)', 
        y='Observed PeakFlow (cfs)', 
        s=50, 
        marker='d', 
        color='r') 

df21 = df2.xs('1-1 Match', axis=1).set_index('X-Axis') 
df21.index.name = None 
df21.columns = ['1-1 Match'] 
df21.plot(c='black', ax=ax) 

df22 = df2.xs('-15% Peak Flow', axis=1).set_index('X-Axis') 
df22.index.name = None 
df22.columns = ['-15% Peak Flow'] 
df22.plot(c='blue',ls='--', ax=ax) 

df23 = df2.xs('+25% Peak Flow', axis=1).set_index('X-Axis') 
df23.index.name = None 
df23.columns = ['+25% Peak Flow'] 
df23.plot(c='blue',ls='--', ax=ax) 

graphs

EDIT1:

MultiIndex проблематично, поэтому необходимо:

df2 = df2.read_csv('file', header=[0,1]) 

print (df2) 
    1-1 Match Unnamed: 1_level_0 -15% Peak Flow Unnamed: 3_level_0 \ 
    X-Axis    Y-Axis   X-Axis    Y-Axis 
0   0     0    0     0 
1  200    200   200    170 

    +25% Peak Flow Unnamed: 5_level_0 
      X-Axis    Y-Axis 
0    0     0 
1   200    250 
cols = df2.columns.get_level_values(0) 
cols = cols.where(~cols.str.contains('Unnamed')).to_series().ffill().tolist() 
df2.columns = [cols, df2.columns.get_level_values(1)] 
df2 = df2.sort_index(level=0, axis=1) 
print (df2) 
    +25% Peak Flow  -15% Peak Flow  1-1 Match  
      X-Axis Y-Axis   X-Axis Y-Axis X-Axis Y-Axis 
0    0  0    0  0   0  0 
1   200 250   200 170  200 200 

print (df2.columns) 
MultiIndex(levels=[['+25% Peak Flow', '-15% Peak Flow', '1-1 Match'], 
        ['X-Axis', 'Y-Axis']], 
      labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]]) 
+0

Благодаря Jezrael. Проверьте мои вопросы. Из-за этого я получаю ошибку «Multiindex not defined». – nish

+0

Проверьте последние изменения. – jezrael

+0

Жаль опять эта ошибка: объект «Index» не имеет атрибута 'where' – nish