问候语 我尝试获得有效行
的最小尺寸数据帧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
答案 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是引人注目的结合。