J'ai une trame de données (330 lignes × 11 colonnes) indexée par un entier (âge). Je voudrais sous-échantillonner pour dataframe à 97 lignes. Quelqu'un peut-il penser à un moyen élégant et simple d'y parvenir?

Exemples de données:

    subsidence1.1   subsidence1.11  subsidence1.12  subsidence1.13  subsidence1.14  subsidence1.15  subsidence1.16  subsidence1.17  subsidence1.18  subsidence1.19  subsidence1.2
age                                         
303.982536  0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000
302.959104  -16.072090  -15.377285  -14.688177  -14.007097  -13.330865  -12.661389  -11.998249  -11.341865  -10.690118  -10.046194  -9.405841
301.947395  -20.178141  -18.767330  -17.372894  -15.990381  -14.623930  -13.268656  -11.927322  -10.599186  -9.284892   -7.981037   -6.691025
300.935685  -24.105568  -21.968602  -19.854874  -17.763423  -15.692894  -13.644213  -11.617834  -9.611091   -7.625165   -5.658335   -3.711900
299.923975  -27.892780  -25.020903  -22.178156  -19.369872  -16.592970  -13.843728  -11.126516  -8.437073   -5.777435   -3.144508   -0.539260
298.912265  -31.562993  -27.947536  -24.375001  -20.842286  -17.351752  -13.900609  -10.488683  -7.114587   -3.778202   -0.477744   2.785826
298.100567  -39.202321  -35.212732  -31.271504  -27.376498  -23.527739  -19.723348  -15.963993  -12.246264  -8.571384   -4.937769   -1.344742
297.888964  -46.722928  -42.359208  -38.049286  -33.791991  -29.585005  -25.427365  -21.320583  -17.259219  -13.245845  -9.279074   -5.356589
296.877373  -50.083382  -44.967299  -39.916886  -34.931039  -30.005863  -25.141908  -20.336060  -15.590047  -10.899534  -6.266525   -1.686869
295.865782  -53.361746  -47.492007  -41.698160  -35.981292  -30.336933  -24.764152  -19.263568  -13.830113  -8.465904   -3.166812   2.067072
294.854191  -56.568517  -49.941151  -43.402492  -36.951362  -30.587567  -24.307742  -18.110565  -11.992692  -5.954436   0.007303    5.892680
293.842600  -59.708739  -52.321161  -45.035074  -37.852737  -30.768427  -23.779991  -16.886848  -10.086845  -3.376732   3.245537    9.781500
292.831009  -62.788359  -54.637342  -46.605512  -38.688092  -30.884265  -23.188478  -15.601343  -8.119917   -0.739700   6.539949    13.720849
291.819418  -65.808873  -56.896600  -48.115167  -39.464029  -30.940535  -22.540796  -14.260980  -6.099704   1.947892    9.881598    17.705631
290.807826  -68.779624  -59.100448  -49.570440  -40.185734  -30.944376  -21.839856  -12.870296  -4.032015   4.680143    13.264523   21.727727
289.796235  -71.698178  -61.255064  -50.976437  -40.859740  -30.899700  -21.092739  -11.434164  -1.919832   7.451046    16.683478   25.783125
288.784644  -74.572221  -63.363381  -52.335479  -41.485496  -30.809202  -20.301245  -9.956993   0.228472    10.256670   20.135201   29.864378
287.773053  -77.400957  -65.426637  -53.650249  -42.071183  -30.678738  -19.471188  -8.442615   2.411406    13.095121   23.612912   33.96932

Merci

1
user9454050 18 avril 2018 à 06:21

3 réponses

Meilleure réponse

Utilisez np.linspace

df.iloc[np.linspace(0, len(df) - 1, 97).astype(int)]

Exemple utilisant des données plus courtes.

df = pd.DataFrame(np.repeat(np.arange(33)[:, None], 3, axis=1))

# Use 7 to guarantee a length 7 result.
df.iloc[np.linspace(0, len(df) - 1, 7).astype(int)]

     0   1   2
0    0   0   0
5    5   5   5
10  10  10  10
16  16  16  16
21  21  21  21
26  26  26  26
32  32  32  32
1
piRSquared 18 avril 2018 à 04:03

Utilisez simplement le sample méthode d'un bloc de données

# assume df is your dataframe
sample = df.sample(n=97)
0
rafaelc 18 avril 2018 à 04:01

Si vous voulez prendre tous les 10 rangs (comme indiqué dans les commentaires), faites simplement

df[::10]
0
rafaelc 18 avril 2018 à 03:44