python - 为什么在构造 multiIndex Dataframe 时所有元素都是 NaN
问题描述
假设我有一个这样的数据框。我想将其转换为 2 级多索引数据框。
dt st close volume
0 20100101 000001.sz 1 10000
1 20100101 000002.sz 10 50000
2 20100101 000003.sz 5 1000
3 20100101 000004.sz 15 7000
4 20100101 000005.sz 100 100000
5 20100102 000001.sz 2 20000
6 20100102 000002.sz 20 60000
7 20100102 000003.sz 6 2000
8 20100102 000004.sz 20 8000
9 20100102 000005.sz 110 110000
但是当我尝试这段代码时:
data = pd.read_csv('data/trial.csv')
print(data)
idx = pd.MultiIndex.from_product([data.dt.unique(),
data.st.unique()],
names=['dt', 'st'])
col = ['close', 'volume']
df = pd.DataFrame(data, idx, col)
print(df)
我发现所有元素都是 NaN
close volume
dt st
20100101 000001.sz NaN NaN
000002.sz NaN NaN
000003.sz NaN NaN
000004.sz NaN NaN
000005.sz NaN NaN
20100102 000001.sz NaN NaN
000002.sz NaN NaN
000003.sz NaN NaN
000004.sz NaN NaN
000005.sz NaN NaN
如何处理这种情况?谢谢。
解决方案
你只需要参数index_col
:read_csv
#by positions of columns
data = pd.read_csv('data/trial.csv', index_col=[0,1])
或者:
#by names of columns
data = pd.read_csv('data/trial.csv', index_col=['dt', 'st'])
print (data)
close volume
dt st
20100101 000001.sz 1 10000
000002.sz 10 50000
000003.sz 5 1000
000004.sz 15 7000
000005.sz 100 100000
20100102 000001.sz 2 20000
000002.sz 20 60000
000003.sz 6 2000
000004.sz 20 8000
000005.sz 110 110000
为什么在构造 multiIndex Dataframe 时所有元素都是 NaN?
原因在DataFrame
构造函数中:
df = pd.DataFrame(data, idx, col)
DataFrame
调用data
hasRangeIndex
并且不与 new 对齐MultiIndex
,因此获取NaN
数据中的 s。
如果总是每个都dt
具有相同st
的值,则可能的解决方案是按列名称过滤 Dataframe,然后转换为numpy array
,但更好的是index_col
和set_index
解决方案:
df = pd.DataFrame(data[col].values, idx, col)
推荐阅读
- python - Python 3:如何通过脚本运行 NMAP 命令
- python - 使用 Python 从动态 CSV 输出创建 Master excel 文件
- bash - 在 Bash 函数的参数中出现通配符问题
- abap - FM 将时间从 24 小时格式转换为 12 小时格式?
- javascript - Google placeId 查找器
- oop - 使用泛型参数覆盖 Dart 方法
- javascript - 如何使用 OpenLayer 和 WFS 过滤特征?
- python - 如何在python中转换给定的数据集?
- solr - 如何将现有核心添加到本地的 solr 搜索中
- c# - 如何为在其中使用 linq 查询的异步类型方法编写单元测试代码