仅访问数据框的前 80% 列

access only first 80% columns of a data frame

我只想访问数据框的前 80% 列并将其存储到新数据框中,而将剩余的 20% 列存储到另一个数据框中。这是我试过的东西:

ratings_df=ratings_df.iloc[:,:int(ratings_df.shape()[1]*0.8)-1]

然而这给出了一个错误:

Traceback (most recent call last):
  File "S:\TIP\Code\MF_research.py", line 15, in <module>
    ratins_df=ratings_df.iloc[:,:int(ratings_df.shape()[1]*0.8)-1]
TypeError: 'tuple' object is not callable

ratings_df:

MovieID  1     2     3     4     5     6     ...  3947  3948  3949  3950  3951  3952
UserID                                       ...                                    
1         5.0   0.0   0.0   0.0   0.0   0.0  ...   0.0   0.0   0.0   0.0   0.0   0.0
2         0.0   0.0   0.0   0.0   0.0   0.0  ...   0.0   0.0   0.0   0.0   0.0   0.0
3         0.0   0.0   0.0   0.0   0.0   0.0  ...   0.0   0.0   0.0   0.0   0.0   0.0
4         0.0   0.0   0.0   0.0   0.0   0.0  ...   0.0   0.0   0.0   0.0   0.0   0.0
5         0.0   0.0   0.0   0.0   0.0   2.0  ...   0.0   0.0   0.0   0.0   0.0   0.0
...       ...   ...   ...   ...   ...   ...  ...   ...   ...   ...   ...   ...   ...
6036      0.0   0.0   0.0   2.0   0.0   3.0  ...   0.0   0.0   0.0   0.0   0.0   0.0
6037      0.0   0.0   0.0   0.0   0.0   0.0  ...   0.0   0.0   0.0   0.0   0.0   0.0
6038      0.0   0.0   0.0   0.0   0.0   0.0  ...   0.0   0.0   0.0   0.0   0.0   0.0
6039      0.0   0.0   0.0   0.0   0.0   0.0  ...   0.0   0.0   0.0   0.0   0.0   0.0
6040      3.0   0.0   0.0   0.0   0.0   0.0  ...   0.0   0.0   0.0   0.0   0.0   0.0

[6040 rows x 3706 columns]

您应该删除括号。您只需要 df.shape[1]。 顺便说一下,为了提高可读性,我建议你使用 rather

shape_80 = int(df.shape[1]*0.8)-1
ratings_df=ratings_df.iloc[:,:shape_80]

或者类似的东西

您可以使用 .shape 方法获取所有行和列。

ratings_df.shape returns(行数,列数)如果你 select 使用 [1] 元组的第二个元素,你会得到所有行数

df1 = ratings_df.iloc[:,:round(0.8*ratings_df.shape[1])]
df2 = ratings_df.iloc[:,round(0.2*ratings_df.shape[1]):]
  • 按列拆分: 这可以是将一个 DataFrame 拆分为两个 DataFrame 的一种方法。
import pandas as pd 
  
# intialise data of lists. 
data = {'Name':['A', 'B', 'C'], 
        'Age':[20, 24, 21],
        'Sex': ['M', 'F', 'M'],
        'Group': ['Science', 'Arts', 'Science']} 
  
# Create DataFrame 
df = pd.DataFrame(data)

valuesArr = df.values
columnsArr = df.columns

arr80 = valuesArr[:, 0:int(len(columnsArr)*0.80)]
arr20 = valuesArr[:, int(len(columnsArr)*0.80):]

df80 = pd.DataFrame(data=arr80, columns=columnsArr[0:int(len(columnsArr)*0.80)])
df20 = pd.DataFrame(data=arr20, columns=columnsArr[int(len(columnsArr)*0.80):])

print(df80)
print(df20)
OUTPUT:
  Name Age Sex
0    A  20   M
1    B  24   F
2    C  21   M
     Group
0  Science
1     Arts
2  Science
  • 按行拆分: 如果您想使用行而不是列来拆分数据框,那么它可能是一种方法。 我希望它对某人有所帮助!
import pandas as pd 
  
# initialise data of lists. 
data = {'Name':['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], 
        'Age':[20, 24, 21, 19, 18, 21, 19, 19, 20, 30]} 
  
# Create DataFrame 
df = pd.DataFrame(data)

valuesArr = df.values

arr80 = valuesArr[:int(len(valuesArr)*0.80)]
arr20 = valuesArr[int(len(valuesArr)*0.80):]

df80 = pd.DataFrame(data=arr80, columns=df.columns)
df20 = pd.DataFrame(data=arr20, columns=df.columns)

print(df80)
print(df20)
OUTPUT:
  Name Age
0    A  20
1    B  24
2    C  21
3    D  19
4    E  18
5    F  21
6    G  19
7    H  19
  Name Age
0    I  20
1    J  30

如果列的顺序无关紧要,您可以尝试一个非常简短的解决方案:

df.sample(frac=0.8, axis=1)