Pandas 通过前导NaN向左移动行';不删除所有NaN';s

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,

在不删除所有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,     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的答案,因为他是第一个回答的。