![](/img/trans.png)
[英]set multiple Pandas DataFrame columns to values in a single column or multiple scalar values at the same time
[英]Aggregate values of same name pandas dataframe columns to single column
我有多個通過標記代碼生成的csv文件。 這些文件包含大寫和小寫的關鍵字。 我想將所有這些文件合並在一個包含小寫的所有唯一值(總和)的單個數據框中。 您建議如何獲得以下結果?
初始DF:
+---+---+----+-----+
| a | b | A | B |
+---+---+----+-----+
| 1 | 2 | 3 | 1 |
| 2 | 1 | 3 | 1 |
+---+---+----+-----+
結果
+---+---+
| a | b |
+---+---+
| 4 | 3 |
| 5 | 2 |
+---+---+
我無權訪問從中創建csv文件的原始數據,因此我無法在較早的步驟進行更正。 目前,我嘗試將.lower()映射到我創建的數據幀頭,但是它返回具有相同名稱的單獨列,如下所示:
使用熊貓不是必需的。 我曾考慮過將csv文件轉換成字典,然后嘗試上述過程(結果是比我想象的要復雜得多)或使用列表。 另外,group by不會執行此操作,因為它將刪除非重復的列名。 任何方法都歡迎。
下面的解決方案應該做:
import pandas as pd
import numpy as np
np.random.seed(seed=1902)
test_df = pd.DataFrame({
# some ways to create random data
'a': np.random.randint(9, size=5),
'b': np.random.randint(9, size=5),
'A': np.random.randint(9, size=5),
'B': np.random.randint(9, size=5),
'c': np.random.randint(9, size=5),
})
sum_df = test_df.copy()
columns_to_keep = set([name.lower() for name in list(test_df)])
for column_name in columns_to_keep:
mutual_columns = [column_name, column_name.upper()]
mutual_columns = [value for value in mutual_columns if value in list(test_df)]
sum_df[column_name] = test_df[mutual_columns].sum(axis=1)
sum_df = sum_df[list(columns_to_keep)]
print("original is:\n", test_df)
print("sum is:\n", sum_df)
生產
original is:
a b A B c
0 2 5 7 2 4
1 1 6 2 3 1
2 0 4 2 4 3
3 6 5 5 7 4
4 1 0 2 7 5
sum is:
a b c
0 9 7 4
1 3 9 1
2 2 8 3
3 11 12 4
4 7 5 3
基本上是創建一個相互依存的列的列表,以求和(分別由列名及其相應的上或下給定),並沿行求和,僅與那些行相對應。
您可以遍歷所有具有相同小寫字母表示形式的列:
def sumDupeColumns(df):
"""Return dataframe with columns with the same lowercase spelling summed."""
# Get list of unique lowercase column headers
columns = set(map(str.lower, df.columns))
# Create new (zero-initialised) dataframe for output
df1 = pd.DataFrame(data=np.zeros((len(df), len(columns))), columns=columns)
# Sum matching columns
for col in df.columns:
df1[col.lower()] += df[col]
return df1
import pandas as pd
import numpy as np
np.random.seed(seed=42)
# Generate DataFrame with random int input and 'duplicate' columns to sum
df = pd.DataFrame(columns = ['a','A','b','B','Cc','cC','d','eEe','eeE','Eee'],
data = np.random.randint(9, size=(5,10))
df = sumDupeColumns(df)
>>> print(df)
d eee cc a b
0 6.0 14.0 8.0 9.0 11.0
1 7.0 10.0 5.0 14.0 7.0
2 3.0 14.0 8.0 5.0 8.0
3 3.0 17.0 7.0 8.0 12.0
4 0.0 11.0 9.0 5.0 9.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.