DF 是一個包含 [A1,B1,C1,A2,B2,C2,A3,B3,C3] 列的資料框
我想將該“DF”資料幀拆分為小資料幀 DF1、DF2、DF3
DF1 將 [A1,B1,C1] 作為列
DF2 將 [A2,B2,C2] 作為列
DF3 將 [A3,B3,C3] 作為列
資料框 DF'3' 名稱中的數字應與其列 [A'3',B'3',C'3'] 匹配
我試過
for i in range(1,4):
'DF{}'.format(i)=DF[DF['A{}'.format(i),'B{}'.format(i),'C{}'.format(i)]]
得到錯誤
SyntaxError: cannot assign to function call
是否可以在單個回圈中執行此操作?
uj5u.com熱心網友回復:
錯誤訊息源于嘗試將資料幀分配給字串格式函式,而不是變數。
動態地創建變數 from DF1to DFNfor Nnumbers 可能有點棘手。不過,在 dicts 中創建 key-item 對很容易。請嘗試以下操作:
dfs = {}
for i in range(1,4):
dfs["DF{}".format(i)] = DF[["A{}".format(i), "B{}".format(i), "C{}".format(i)]]
不是得到DF1,DF2和DF3變數,而是得到dfs["DF1"], dfs["DF2"], 和dfs["DF3"]
uj5u.com熱心網友回復:
您不能動態更改物件的名稱。
您可以使用具有 dfs 顯式定義的串列推導式:
df1,df2,df3=[df[['A{}'.format(i),'B{}'.format(i),'C{}'.format(i)]] for i in range(1,4)]
根據 ViettelSolutions 的評論進行更新
這是一種更簡潔的方法:df1,df2,df3=[df[[f'A{i}',f'B{i}','C{i}']] for i in range(1,4)]
您還可以使用串列而不是顯式命名 dfs,并在需要時解壓縮它們。
n=4 # Define the number of dfs
dfs=[df[['A{}'.format(i),'B{}'.format(i),'C{}'.format(i)]] for i in range(1,n)]
uj5u.com熱心網友回復:
您可以使其完全可配置:
def split_dataframe(df, letters, numbers):
return [df[[f'{letter}{number}' for letter in letters]] for number in numbers]
letters = ("A","B","C")
numbers = range(1,4)
df1, df2, df3 = split_dataframe(df, letters, numbers)
您可以使其功能更加通用,如下所示:
import re
letters_pattern = re.compile("^\D ")
numbers_pattern = re.compile("\d $")
def split_dataframe(df):
letters = sorted(set(letters_pattern.findall(x)[0] for x in df.columns))
numbers = sorted(set(numbers_pattern.findall(x)[0] for x in df.columns))
return [df[[x for x in [f'{letter}{number}' for letter in letters] if x in df.columns]] for number in numbers]
這種方法有兩個優點:
- 您不需要提前提供字母和數字,該方法會發現標題中可用的內容并繼續
- 它將管理“不規則”情況 - 例如,當
d1存在但d2不存在時
舉一個具體的例子:
df = pd.DataFrame({"A1":[1,2], "B1":[2,3], "C1":[3,4], "D1":[4,5], "A2":[2,3], "B2":[10,11], "C2":[12,13]})
for sub_df in split_dataframe(df):
print(sub_df)
輸出
A1 B1 C1 D1
0 1 2 3 4
1 2 3 4 5
A2 B2 C2
0 2 10 12
1 3 11 13
如果您通過并且只想考慮,可以將列名稱發現程序設定為可選,如下所示:lettersnumbers
def split_dataframe(df, letters=None, numbers=None):
letters = sorted(set(letters_pattern.findall(x)[0] for x in df.columns)) if letters is None else letters
numbers = sorted(set(numbers_pattern.findall(x)[0] for x in df.columns)) if numbers is None else numbers
return [df[[x for x in [f'{letter}{number}' for letter in letters] if x in df.columns]] for number in numbers]
for sub_df in split_dataframe(df, letters=("B","C"), numbers=[1,2]):
print(sub_df)
輸出
B1 C1
0 2 3
1 3 4
B2 C2
0 10 12
1 11 13
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/399105.html
上一篇:資料框條件洗掉重復行
