我正在尝试将此条件子句放入列表组合“ arr”。
arr = [[(i*n+j) for i in range(n)] for j in range(n)]
与
if ( 2*i<=j+i+1<=n+1 and i>0)
作为条件。我试着把这个:
-在三元数前面有else语句:“”,但这会在数组中产生不需要的元素。
-就像我的for语句之后一样(i,j,甚至都尝试过)
关于如何在不增加太多复杂性的情况下进行计算的任何想法?
所需的示例输出:
from pandas import DataFrame as df
n = 5
arr= [NEEDS HELP HERE]
print(df(arr))
>>>
0 1 2 3 4
0 NaN 5 NaN NaN NaN
1 NaN 6 11.0 NaN NaN
2 NaN 7 12.0 17.0 NaN
3 NaN 8 13.0 NaN NaN
4 NaN 9 NaN NaN NaN
FOR n = 3
>>>
0 1 2
0 NaN 3 NaN
1 NaN 4 7.0
2 NaN 5 NaN
对于n = 2
>>>
0 1
0 NaN 2
1 NaN 3
对于n = 10(我的代码可以生成以下内容)
>>>
0 1 2 3 4 5 6 7 8 9
0 _ 10 _ _ _ _ _ _ _ _
1 _ 11 21 _ _ _ _ _ _ _
2 _ 12 22 32 _ _ _ _ _ _
3 _ 13 23 33 43 _ _ _ _ _
4 _ 14 24 34 44 54 _ _ _ _
5 _ 15 25 35 45 55 _ _ _ _
6 _ 16 26 36 46 _ _ _ _ _
7 _ 17 27 37 _ _ _ _ _ _
8 _ 18 28 _ _ _ _ _ _ _
9 _ 19 _ _ _ _ _ _ _ _
如您所见,每个应该产生一个nxn矩阵。 (我可以将每个“ _”替换为np.NaN)
我将在下面发布解决方案。非常感谢您的所有贡献。
答案 0 :(得分:0)
您可以将其放在内部列表理解中:
arr = [[(i*n+j) for i in range(n) if ( 2*i<=j+i+1<=n+1 and i>0)] for j in range(n)]
输出:
n = 10 # for example
print(arr)
[[10],
[11, 21],
[12, 22, 32],
[13, 23, 33, 43],
[14, 24, 34, 44, 54],
[15, 25, 35, 45, 55],
[16, 26, 36, 46],
[17, 27, 37],
[18, 28],
[19]]
编辑:
如果要在具有所需输出的DataFrame中使用它:
import numpy as np
import pandas as pd
n = 10
arr = [[np.NaN] + [(i*n+j) for i in range(n) if ( 2*i<=j+i+1<=n+1 and i>0)] + [np.NaN] * (n - j - 2) for j in range(n)]
pd.DataFrame(arr)
0 1 2 3 4 5 6 7 8 9
0 NaN 10 NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN 11 21.0 NaN NaN NaN NaN NaN NaN NaN
2 NaN 12 22.0 32.0 NaN NaN NaN NaN NaN NaN
3 NaN 13 23.0 33.0 43.0 NaN NaN NaN NaN NaN
4 NaN 14 24.0 34.0 44.0 54.0 NaN NaN NaN NaN
5 NaN 15 25.0 35.0 45.0 55.0 NaN NaN NaN NaN
6 NaN 16 26.0 36.0 46.0 NaN NaN NaN NaN NaN
7 NaN 17 27.0 37.0 NaN NaN NaN NaN NaN NaN
8 NaN 18 28.0 NaN NaN NaN NaN NaN NaN NaN
9 NaN 19 NaN NaN NaN NaN NaN NaN NaN NaN
答案 1 :(得分:0)
您可以按照@ user2357112的建议进行一些简化:
import numpy as np
import pandas as pd
n = 6
arr = ([i*n+j for i in range(1,n-j+1) if i<=j+1] for j in range(n))
df = pd.DataFrame([np.NaN]+x+[np.NaN]*(n-len(x)-1) for x in arr)
print(df)
输出:
0 1 2 3 4 5
0 NaN 6 NaN NaN NaN NaN
1 NaN 7 13.0 NaN NaN NaN
2 NaN 8 14.0 20.0 NaN NaN
3 NaN 9 15.0 21.0 NaN NaN
4 NaN 10 16.0 NaN NaN NaN
5 NaN 11 NaN NaN NaN NaN
答案 2 :(得分:0)
from pandas import DataFrame as df
import numpy as np
n = {USERINPUT_Var_(int>1)}
arr = [[i*n+j if ( 2*i<=j+i+1<=n+1 and i>0) else np.NaN for i in range(n)] for j in range(n)]
print(df(arr))
我现在仍然可以使用一些简化条件的帮助。