Pandas 通过前导NaN向左移动行';不删除所有NaN';s
在不删除所有NaN的情况下,通过引导NaN向左移动行 在读取csv文件时,如何删除熊猫中的前导NaN 示例代码:Pandas 通过前导NaN向左移动行';不删除所有NaN';s,pandas,dataframe,numpy,Pandas,Dataframe,Numpy,在不删除所有NaN的情况下,通过引导NaN向左移动行 在读取csv文件时,如何删除熊猫中的前导NaN 示例代码: df = pd.DataFrame({ 'c1': [ 20, 30, np.nan, np.nan, np.nan, 17, np.nan], 'c2': [np.nan, 74, 65, np.nan, np.nan, 74, 82], 'c3': [ 250, 290, 340,
df = pd.DataFrame({
'c1': [ 20, 30, np.nan, np.nan, np.nan, 17, np.nan],
'c2': [np.nan, 74, 65, np.nan, np.nan, 74, 82],
'c3': [ 250, 290, 340, 325, 345, 315, 248],
'c4': [ 250, np.nan, 340, 325, 345, 315, 248],
'c5': [np.nan, np.nan, 340, np.nan, 345, np.nan, 248],
'c6': [np.nan, np.nan, np.nan, 325, 345, np.nan, np.nan]})
代码显示了这一点
| | c1 | c2 | c3 | c4 | c5 | c6 |
|:-|-----:|-----:|----:|------:|------:|------:|
|0 | 20.0 | NaN | 250 | 250.0 | NaN | NaN |
|1 | 30.0 | 74.0 | 290 | NaN | NaN | NaN |
|2 | NaN | 65.0 | 340 | 340.0 | 340.0 | NaN |
|3 | NaN | NaN | 325 | 325.0 | NaN | 325.0 |
|4 | NaN | NaN | 345 | 345.0 | 345.0 | 345.0 |
|5 | 17.0 | 74.0 | 315 | 315.0 | NaN | NaN |
|6 | NaN | 82.0 | 248 | 248.0 | 248.0 | NaN |
我只想重演领先的NaN,所以结果会是这样的
| | c1 | c2 | c3 | c4 | c5 | c6 |
|:-|-----:|-----:|----:|------:|------:|------:|
|0 | 20 | NaN | 250.0 | 250.0 | NaN | NaN |
|1 | 30 | 74.0 | 290.0 | NaN | NaN | NaN |
|2 | 65 | 340.0 | 340.0 | 340.0 | NaN | NaN |
|3 | 325 | 325.0 | NaN | 325.0 | NaN | NaN |
|4 | 345 | 345.0 | 345.0 | 345.0 | NaN | NaN |
|5 | 17 | 74.0 | 315.0 | 315.0 | NaN | NaN |
|6 | 82 | 248.0 | 248.0 | 248.0 | NaN | NaN |
我尝试了以下方法,但没有成功
response = pd.read_csv (r'MonthlyPermitReport.csv')
df = pd.DataFrame(response)
df.loc[df.first_valid_index():]
请提供帮助。让我们尝试应用创建列表,然后重新创建数据帧
out = pd.DataFrame(df.apply(lambda x : [x[x.notna().cumsum()>0].tolist()],1).str[0].tolist(),
index=df.index,
columns=df.columns)
Out[102]:
c1 c2 c3 c4 c5 c6
0 20.0 NaN 250.0 250.0 NaN NaN
1 30.0 74.0 290.0 NaN NaN NaN
2 65.0 340.0 340.0 340.0 NaN NaN
3 325.0 325.0 NaN 325.0 NaN NaN
4 345.0 345.0 345.0 345.0 NaN NaN
5 17.0 74.0 315.0 315.0 NaN NaN
6 82.0 248.0 248.0 248.0 NaN NaN
让我们尝试应用创建列表,然后重新创建数据帧
out = pd.DataFrame(df.apply(lambda x : [x[x.notna().cumsum()>0].tolist()],1).str[0].tolist(),
index=df.index,
columns=df.columns)
Out[102]:
c1 c2 c3 c4 c5 c6
0 20.0 NaN 250.0 250.0 NaN NaN
1 30.0 74.0 290.0 NaN NaN NaN
2 65.0 340.0 340.0 340.0 NaN NaN
3 325.0 325.0 NaN 325.0 NaN NaN
4 345.0 345.0 345.0 345.0 NaN NaN
5 17.0 74.0 315.0 315.0 NaN NaN
6 82.0 248.0 248.0 248.0 NaN NaN
您可以尝试以下方法:
s = df.isna().cumprod(axis=1).sum(axis=1)
df.apply(lambda x: x.shift(-s[x.name]), axis=1)
输出:
c1 c2 c3 c4 c5 c6
0 20.0 NaN 250.0 250.0 NaN NaN
1 30.0 74.0 290.0 NaN NaN NaN
2 65.0 340.0 340.0 340.0 NaN NaN
3 325.0 325.0 NaN 325.0 NaN NaN
4 345.0 345.0 345.0 345.0 NaN NaN
5 17.0 74.0 315.0 315.0 NaN NaN
6 82.0 248.0 248.0 248.0 NaN NaN
详细信息:
s、 是对一行中前导NaN的数量进行计数的序列isna
查找数据帧中的所有NaN值,然后沿行轴使用cumprod
将非NaN值乘以零以消除NaN。最后,我们沿行使用sum
来计算每行的移位位数
使用数据帧apply
和axis=1
(按行)在df.apply(axis=1)中调用的pd.Series的名称是数据帧的行索引。因此,我们可以使用上面定义的获取要移位的时段数。您可以尝试以下方法:
s = df.isna().cumprod(axis=1).sum(axis=1)
df.apply(lambda x: x.shift(-s[x.name]), axis=1)
输出:
c1 c2 c3 c4 c5 c6
0 20.0 NaN 250.0 250.0 NaN NaN
1 30.0 74.0 290.0 NaN NaN NaN
2 65.0 340.0 340.0 340.0 NaN NaN
3 325.0 325.0 NaN 325.0 NaN NaN
4 345.0 345.0 345.0 345.0 NaN NaN
5 17.0 74.0 315.0 315.0 NaN NaN
6 82.0 248.0 248.0 248.0 NaN NaN
详细信息:
s、 是对一行中前导NaN的数量进行计数的序列isna
查找数据帧中的所有NaN值,然后沿行轴使用cumprod
将非NaN值乘以零以消除NaN。最后,我们沿行使用sum
来计算每行的移位位数
使用数据帧
apply
和axis=1
(按行)在df.apply(axis=1)中调用的pd.Series的名称是数据帧的行索引。因此,我们可以使用上面定义的s获取要移位的周期数。这也很有效。谢谢你的解释。甚至比Beny的方法稍微快一点。选择Beny的答案,因为他是第一个回答。这也很有效。谢谢你的解释。甚至比Beny的方法稍微快一点。选择Beny的答案,因为他是第一个回答的。