Mars DataFrame#

想快速了解 Mars DataFrame,请访问 10 分钟入门 Mars DataFrame

Mars DataFrame 的创建方式和 pandas DataFrame 非常相似。

>>> import mars.dataframe as md
>>> md.DataFrame({'a': [1, 2, 3], 'b': ['s1', 's2', 's3']})
DataFrame <op=DataFrameDataSource, key=12ee87049f2f1125ffaa84e91f790249>

也可以直接从 pandas DataFrame 创建 Mars DataFrame。

>>> import pandas as pd
>>> md.DataFrame(pd.DataFrame([[1, 2], [3, 4]]))
DataFrame <op=DataFrameDataSource, key=853b0d99cd26ec82751524899172eb8c>

从 Mars tensor 创建 Mars DataFrame。

>>> md.DataFrame(mt.random.rand(3, 3))
DataFrame <op=DataFrameFromTensor, key=10a421ed18adfa42cb649aa575a1d763>

Mars DataFrame 能通过 CSV 文件和 SQL 表来创建。

>>> md.read_csv('Downloads/ratings.csv')
DataFrame <op=DataFrameReadCSV, key=48550937383cbea63d4f9f24f3eb1a17>

Mars DataFrame 也能够通过提供 URL 读取 HDFS 来创建。

>>> df = md.read_csv('hdfs://localhost:8020/test.csv')

关于如何创建 DataFrame,参考 Factory Functions

类似 Mars tensor,DataFrame 也是延迟执行的。如果要获取结果,需要调用 .execute()

>>> df = md.read_csv('Downloads/ratings.csv')
>>> grouped = df.groupby('movieId').agg({'rating': ['min', 'max', 'mean', 'std']})
>>> grouped.execute()
        rating
           min  max      mean       std
movieId
1          0.5  5.0  3.921240  0.889012
2          0.5  5.0  3.211977  0.951150
3          0.5  5.0  3.151040  1.006642
4          0.5  5.0  2.861393  1.095702
5          0.5  5.0  3.064592  0.982140
...        ...  ...       ...       ...
131254     4.0  4.0  4.000000       NaN
131256     4.0  4.0  4.000000       NaN
131258     2.5  2.5  2.500000       NaN
131260     3.0  3.0  3.000000       NaN
131262     4.0  4.0  4.000000       NaN

[26744 rows x 4 columns]

记住,DataFrame.execute() 会返回 DataFrame 自身。

了解更多 DataFrame 接口,参考 API Reference

调用 .execute().fetch() 来把 Mars DataFrame 转成 pandas。或者使用快捷方法 .to_pandas()

>>> type(grouped.execute())
mars.dataframe.core.DataFrame

>>> type(grouped.execute().fetch())
pandas.core.frame.DataFrame

>>> type(grouped.to_pandas())
pandas.core.frame.DataFrame

>>> grouped.to_pandas()
        rating
           min  max      mean       std
movieId
1          0.5  5.0  3.921240  0.889012
2          0.5  5.0  3.211977  0.951150
3          0.5  5.0  3.151040  1.006642
4          0.5  5.0  2.861393  1.095702
5          0.5  5.0  3.064592  0.982140
...        ...  ...       ...       ...
131254     4.0  4.0  4.000000       NaN
131256     4.0  4.0  4.000000       NaN
131258     2.5  2.5  2.500000       NaN
131260     3.0  3.0  3.000000       NaN
131262     4.0  4.0  4.000000       NaN

[26744 rows x 4 columns]

备注

应当优先考虑使用 .execute() 而不是 .to_pandas(),因为当 DataFrame 很大的时候,.execute() 只会获取前几行和后几行数据来展示。而 .to_pandas() 会在服务端生成完整的 DataFrame,然后返回到客户端,这非常低效,而且很有可能导致内存溢出。

使用 mars.execute() 来执行多个 DataFrame。

>>> import mars
>>> df = md.DataFrame(mt.random.rand(3, 3))
>>> mars.execute(df, df.sum())
(          0         1         2
 0  0.604443  0.743964  0.281236
 1  0.778034  0.634661  0.237829
 2  0.886275  0.456751  0.340311,
 0    2.268752
 1    1.835377
 2    0.859376
 dtype: float64)

DataFrame 能被保存到 CSV 文件。

>>> df.to_csv('Downloads/grouped.csv').execute()
Empty DataFrame
Columns: []
Index: []

参考 api.dataframe.io 获取更多信息。

DataFrame 可以从被保存在 OSS 上的 CSV 文件中读取。

>>> import mars.dataframe as md
>>> from mars.lib.filesystem.oss import build_oss_path
>>> access_key_id = your_oss_id
>>> access_key_secret = your_oss_key
>>> end_point = oss_endpoint
>>> file_path = 'oss://buckey/path/to/data.csv'
>>> auth_path = build_oss_path(file_path, access_key_id, access_key_secret, end_point)
>>> df = md.read_csv(auth_path).execute()

You can find AccessKey by AcessKey Documentation and get endpoint by Comparison table of OSS Region and Endpoint.