如何过滤这个python数据帧

时间:2015-02-07 02:40:18

标签: python pandas dataframe

问候语 我尝试获得有效行

的最小尺寸数据帧
import pandas as pd
import random

columns = ['x0','y0']
df_ = pd.DataFrame(index=range(0,30), columns=columns)
df_ = df_.fillna(0)


columns1 = ['x1','y1']

df = pd.DataFrame(index=range(0,11), columns=columns1)



for index, row in df.iterrows():
   df.loc[index, "x1"] = random.randint(1, 100)
   df.loc[index, "y1"] = random.randint(1, 100)

df_ = df_.combine_first(df)    

df = pd.DataFrame(index=range(0,17), columns=columns1)



for index, row in df.iterrows():
    df.loc[index, "x2"] = random.randint(1, 100)
    df.loc[index, "y2"] = random.randint(1, 100)

df_ = df_.combine_first(df)    

从示例中,数据帧应输出0到10之间的行,其余的则被过滤掉。 我想保留一个计数器来跟踪最小行 或使用pandasql 或者如果有从数据框中获取此信息的技巧 数据框的大小

实际上我会附加500多个不同大小的文件来追加 并用它来做一些分析。所以perf是一个考虑因素。

-pudent of python

1 个答案:

答案 0 :(得分:0)

如果要删除具有NaN的行,请使用dropna(此处为前十行):

In [11]: df_.dropna()
Out[11]:
    x0  x1  x2  y0  y1  y2
0    0  49  58   0  68   2
1    0   2  37   0  19  71
2    0  26  95   0  12  17
3    0  87   5   0  70  69
4    0  84  77   0  70  92
5    0  71  98   0  22   5
6    0  28  95   0  70  15
7    0  31  19   0  24  31
8    0   9  37   0  55  29
9    0  30  53   0  15  45
10   0   8  61   0  74  41

然而,更简洁,更有效,更快速地完成整个过程的方法是更新那些第一行(我假设随机整数只是你生成一些示例数据帧)。

让我们将您的DataFrame存储在列表中:

In [21]: df1 = pd.DataFrame([[1, 2], [np.nan, 4]], columns=['a', 'b'])

In [22]: df2 = pd.DataFrame([[1, 2], [5, 6], [7, 8]], columns=['a', 'c'])

In [23]: dfs = [df1, df2]

取最小长度:

In [24]: m = min(len(df) for df in dfs)

首先创建一个包含所需行和列的空DataFrame:

In [25]: columns = reduce(lambda x, y: y.columns.union(x), dfs, [])

In [26]: res = pd.DataFrame(index=np.arange(m), columns=columns)

为了有效地执行此操作,我们将在此DataFrame上更新并进行更改:

In [27]: for df in dfs:
             res.update(df)

In [28]: res
Out[28]:
   a  b  c
0  1  2  2
1  5  4  6

*如果我们没有这样做,或者使用combine_first或类似内容,我们很可能会进行大量复制(创建新的DataFrame),这会减慢速度下来。

注意:combine_first没有提供就位标志......您可以使用联合收割机,但这也更复杂(效率也更低)。在其他地方(并手动更新)使用它也非常简单,哪种IIRC是引人注目的结合。