python - 在多索引列数据框中的列末尾添加值
问题描述
我有一个简单的问题,可能有一个简单的解决方案,但我在任何地方都找不到。我有以下多索引列数据框:
mux = pd.MultiIndex.from_product(['A','B','C'], ['Datetime', 'Str', 'Ret']])
dfr = pd.DataFrame(columns=mux)
| A | B | C |
|Datetime|Str|Ret|Datetime|Str|Ret|Datetime|Str|Ret|
我需要在特定子列的末尾一一添加值。例如,在 A 列子列 Datetime 的末尾添加一个值并保持该行的其余部分不变,然后将另一个值添加到 B 列子列 Str 并再次保持同一行中的其余值不变等等。所以我的问题是:是否可以在这种类型的数据框中定位单个位置?如何?并且是否可以在不知道结束位置的情况下始终在前一个值之后的末尾附加一个单独的值而不是整行?非常感谢您的回答。
解决方案
IIUC,您可以使用.loc
:
idx = len(dfr) # get the index of the next row after the last one
dfr.loc[idx, ('A', 'Datetime')] = pd.to_datetime('2021-09-24')
dfr.loc[idx, ('B', 'Str')] = 'Hello'
dfr.loc[idx, ('C', 'Ret')] = 4.3
输出:
>>> dfr
A B C
Datetime Str Ret Datetime Str Ret Datetime Str Ret
0 2021-09-24 00:00:00 NaN NaN NaN Hello NaN NaN NaN 4.3
更新
我的意思是,例如,当我在不同列中有不同数量的值时(例如,A-Str 列中有 6 个值,但 B-Datetime 列中只有 4 个)但我真的不知道。在这种情况下,我需要在最后一个值之后添加该列中的下一个值,因此我需要知道该特定列的最后一个非 Nan 值的索引,以便我可以在您的答案中使用它,因为如果我使用 len( dfr)在尝试向只有 4 个值的列添加值时,它将最终出现在第 7 行而不是第 5 行,这是因为其中一列的值可能比其他列多。
您可以使用last_valid_index
. 创建一个方便的函数append_to_col
以在数据框中就地附加值:
def append_to_col(col, val):
idx = dfr[col].last_valid_index()
dfr.loc[idx+1 if idx is not None else 0, col] = val
# Fill your dataframe
append_to_col(('A', 'Datetime'), '2021-09-24')
append_to_col(('A', 'Datetime'), '2021-09-25')
append_to_col(('B', 'Str'), 'Hello')
append_to_col(('C', 'Ret'), 4.3)
append_to_col(('C', 'Ret'), 8.2)
append_to_col(('A', 'Datetime'), '2021-09-26')
输出:
>>> dfr
A B C
Datetime Str Ret Datetime Str Ret Datetime Str Ret
0 2021-09-24 NaN NaN NaN Hello NaN NaN NaN 4.3
1 2021-09-25 NaN NaN NaN NaN NaN NaN NaN 8.2
2 2021-09-26 NaN NaN NaN NaN NaN NaN NaN NaN
推荐阅读
- elasticsearch - ElaticSearch 在删除空格和空格字符后查找所有重复项
- vim - 是否可以在 vim 中更改每个文件类型的选项卡标题颜色?
- scala - Spark Listener 中使用的累加器导致值不准确
- mysql - 在 Raspberry 上使用 CRON 备份数据库
- ruby - 在 ruby 中编写类的 attr_accesor 方法
- ios - 如何在 Delphi 中使用 Safari View Controller API 打开 url?
- teradata - 对 TIMESTAMP 值执行 if/else 时出现不匹配错误
- php - WordPress Sticky Post 仅在主页上
- android - 如何使用 firebase 数据库参考在 android studio 内创建带有代码的节点
- performance - 哪个英特尔微架构引入了 ADC reg,0 单 uop 特例?